如何在 Android 的 Google 地图中实现当前位置按钮功能?
当前位置是 Google 地图上的一项功能,可帮助我们在地图上定位设备的位置。通过本文,我们将在实现 Google Maps 的同时实现一个按钮,该按钮将获取我们当前的位置并在地图上进行导航。请注意,我们将使用Kotlin语言来实现这个项目。
按照以下步骤实现地图和导航到设备当前位置的按钮
第 1 步:在 Android Studio 中创建一个新项目
要在 Android Studio 中创建新项目,请参阅如何在 Android Studio 中创建/启动新项目。我们在 Kotlin 中演示了该应用程序,因此请确保在创建新项目时选择Kotlin作为主要语言。
第 2 步:获取和隐藏 API 密钥
我们的应用程序利用 Google 的 Places API 来实现 Google Map,因此我们需要从 Google 获取 Places API 密钥。要获取 API 密钥,请参阅生成用于使用任何 Google API 的 API 密钥。隐藏 API 密钥是必不可少的,为此,请参阅如何在 Android Studio 中隐藏 API 和秘密密钥?。
第 3 步:在 build.gradle 文件中添加依赖项
我们需要添加以下用于导入库的依赖项以支持 Google Map 的实现。
implementation ‘com.google.android.libraries.places:places:2.4.0’
第 4 步:在 Manifest.xml 文件中为应用程序添加权限
由于应用程序主要处理当前位置,因此我们授予应用程序访问该位置的权限。要授予应用程序此类权限,请按以下方式在清单和应用程序开始标记之间声明权限。
XML
XML
Kotlin
import android.Manifest
import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.content.pm.ApplicationInfo
import android.content.pm.PackageManager
import android.location.Location
import android.location.LocationManager
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.Looper
import android.provider.Settings
import android.widget.Button
import android.widget.Toast
import androidx.core.app.ActivityCompat
import com.google.android.gms.location.*
import com.google.android.gms.maps.CameraUpdateFactory
import com.google.android.gms.maps.GoogleMap
import com.google.android.gms.maps.OnMapReadyCallback
import com.google.android.gms.maps.SupportMapFragment
import com.google.android.gms.maps.model.LatLng
import com.google.android.gms.maps.model.MarkerOptions
import com.google.android.libraries.places.api.Places
class MainActivity : AppCompatActivity(), OnMapReadyCallback {
private val pERMISSION_ID = 42
lateinit var mFusedLocationClient: FusedLocationProviderClient
lateinit var mMap: GoogleMap
// Current location is set to India, this will be of no use
var currentLocation: LatLng = LatLng(20.5, 78.9)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Fetching API_KEY which we wrapped
val ai: ApplicationInfo = applicationContext.packageManager
.getApplicationInfo(applicationContext.packageName, PackageManager.GET_META_DATA)
val value = ai.metaData["com.google.android.geo.API_KEY"]
val apiKey = value.toString()
// Initializing the Places API with the help of our API_KEY
if (!Places.isInitialized()) {
Places.initialize(applicationContext, apiKey)
}
// Initializing Map
val mapFragment = supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment
mapFragment.getMapAsync(this)
// Initializing fused location client
mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
// Adding functionality to the button
val btn = findViewById
第 5 步:在 activity_main.xml 文件中实现一个简单的 Button 和 Google Map 片段(前端)
导航到app > res > layout > activity_main.xml并将以下代码添加到该文件中。下面是activity_main.xml文件的代码。
XML
第 6 步:使用 MainActivity.kt(后端)
简而言之,我们所做的是:
- 获取我们在步骤 2 中存储的 API 密钥。
- 使用 API 密钥初始化 Places API。
- 在布局 (activity_main.xml) 中初始化 Map 片段。
- 初始化融合位置客户端。
- 布局中的初始化按钮 (activity_main.xml)。
- 创建了一个函数来获取最后一个位置。
- 创建了一个请求新位置的函数。
- 为位置回调创建了一个函数。
- 创建了一个函数来检查设备的 GPS 是否打开。
- 创建了一个函数来检查是否授予了访问该位置的权限。
- 创建了一个函数来授予访问该位置的权限的请求。
- 创建了一个在授予权限时调用 getLastLocation() 的函数。
转到MainActivity.kt文件并参考以下代码。下面是MainActivity.kt文件的代码。代码中添加了注释以更详细地理解代码。
科特林
import android.Manifest
import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.content.pm.ApplicationInfo
import android.content.pm.PackageManager
import android.location.Location
import android.location.LocationManager
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.Looper
import android.provider.Settings
import android.widget.Button
import android.widget.Toast
import androidx.core.app.ActivityCompat
import com.google.android.gms.location.*
import com.google.android.gms.maps.CameraUpdateFactory
import com.google.android.gms.maps.GoogleMap
import com.google.android.gms.maps.OnMapReadyCallback
import com.google.android.gms.maps.SupportMapFragment
import com.google.android.gms.maps.model.LatLng
import com.google.android.gms.maps.model.MarkerOptions
import com.google.android.libraries.places.api.Places
class MainActivity : AppCompatActivity(), OnMapReadyCallback {
private val pERMISSION_ID = 42
lateinit var mFusedLocationClient: FusedLocationProviderClient
lateinit var mMap: GoogleMap
// Current location is set to India, this will be of no use
var currentLocation: LatLng = LatLng(20.5, 78.9)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Fetching API_KEY which we wrapped
val ai: ApplicationInfo = applicationContext.packageManager
.getApplicationInfo(applicationContext.packageName, PackageManager.GET_META_DATA)
val value = ai.metaData["com.google.android.geo.API_KEY"]
val apiKey = value.toString()
// Initializing the Places API with the help of our API_KEY
if (!Places.isInitialized()) {
Places.initialize(applicationContext, apiKey)
}
// Initializing Map
val mapFragment = supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment
mapFragment.getMapAsync(this)
// Initializing fused location client
mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
// Adding functionality to the button
val btn = findViewById
输出:
Note: The application will prompt for permission requests, kindly allow once. Also, keep the device connected to the internet.