请求提供Android Kotlin获取当前位置详情及FusedLocationProviderClient示例代码
使用FusedLocationProviderClient获取当前位置详情(Android Kotlin)
1. 配置权限
首先在AndroidManifest.xml中添加必要的位置权限:
<!-- 精确位置权限 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 粗略位置权限 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 若需后台定位,添加此权限(Android 10+) --> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
2. Kotlin代码实现
以下是完整的Activity示例,包含权限检查、位置获取逻辑:
import android.Manifest import android.content.pm.PackageManager import android.location.Location import android.os.Bundle import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import com.google.android.gms.location.FusedLocationProviderClient import com.google.android.gms.location.LocationServices import com.google.android.gms.tasks.Task class LocationActivity : AppCompatActivity() { private lateinit var fusedLocationClient: FusedLocationProviderClient private val LOCATION_PERMISSION_REQUEST_CODE = 1001 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_location) // 初始化FusedLocationProviderClient fusedLocationClient = LocationServices.getFusedLocationProviderClient(this) // 检查权限并获取位置 checkLocationPermissionAndFetchLocation() } private fun checkLocationPermissionAndFetchLocation() { when { ActivityCompat.checkSelfPermission( this, Manifest.permission.ACCESS_FINE_LOCATION ) == PackageManager.PERMISSION_GRANTED -> { // 权限已授予,获取当前位置 fetchCurrentLocation() } else -> { // 请求权限 ActivityCompat.requestPermissions( this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), LOCATION_PERMISSION_REQUEST_CODE ) } } } private fun fetchCurrentLocation() { val locationTask: Task<Location> = fusedLocationClient.lastLocation locationTask.addOnSuccessListener { location: Location? -> location?.let { // 获取到位置详情 val latitude = it.latitude val longitude = it.longitude val accuracy = it.accuracy val time = it.time // 处理位置数据,比如显示Toast或更新UI Toast.makeText( this, "纬度: $latitude, 经度: $longitude, 精度: $accuracy 米", Toast.LENGTH_LONG ).show() } ?: run { // 未获取到位置,可能是设备未开启定位或无位置记录 Toast.makeText(this, "无法获取当前位置", Toast.LENGTH_SHORT).show() } } locationTask.addOnFailureListener { exception -> // 获取位置失败,处理异常 Toast.makeText(this, "获取位置失败: ${exception.message}", Toast.LENGTH_SHORT).show() } } override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<out String>, grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == LOCATION_PERMISSION_REQUEST_CODE) { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 权限被授予,获取位置 fetchCurrentLocation() } else { // 权限被拒绝,提示用户 Toast.makeText(this, "需要位置权限才能获取当前位置", Toast.LENGTH_SHORT).show() } } } }
关键说明
FusedLocationProviderClient是Google Play Services提供的位置服务客户端,相比原生LocationManager更高效、稳定,且支持多种定位数据源融合。lastLocation方法返回设备最近记录的位置,若设备未开启定位或无历史位置记录,会返回null,需提前处理该场景。- 如果需要实时持续获取位置更新,可以使用
requestLocationUpdates方法,搭配LocationRequest配置更新频率、精度等参数。
内容的提问来源于stack exchange,提问作者Priya R G
相关产品推荐
相关产品推荐

