在 Android 13 上获取当前位置需要以下几个步骤,确保遵循最新的权限和隐私策略。以下是实现当前位置功能的具体步骤:
1. 检查和申请权限
Android 13 中涉及的权限包括: - 精确位置权限:ACCESS_FINE_LOCATION
- 大致位置权限:ACCESS_COARSE_LOCATION
在 AndroidManifest.xml
中声明权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
在运行时申请权限:
从 Android 6.0 开始,权限需要动态申请。以下是 Kotlin 示例代码:
private val locationPermissionRequest = registerForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()
) { permissions ->
when {
permissions[Manifest.permission.ACCESS_FINE_LOCATION] == true -> {
// 精确位置权限被授予
getCurrentLocation()
}
permissions[Manifest.permission.ACCESS_COARSE_LOCATION] == true -> {
// 大致位置权限被授予
getCurrentLocation()
}
else -> {
// 权限被拒绝
Toast.makeText(this, "需要位置权限以获取当前位置", Toast.LENGTH_SHORT).show()
}
}
}
// 调用此方法申请权限
fun requestLocationPermission() {
locationPermissionRequest.launch(
arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
)
)
}
2. 获取当前位置
需要通过 FusedLocationProviderClient
来获取位置信息。
添加依赖:
在 build.gradle
文件中添加以下依赖:
implementation 'com.google.android.gms:play-services-location:21.0.1'
获取位置代码:
import com.google.android.gms.location.FusedLocationProviderClient
import com.google.android.gms.location.LocationServices
private lateinit var fusedLocationClient: FusedLocationProviderClient
// 初始化 FusedLocationProviderClient
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
}
fun getCurrentLocation() {
if (ActivityCompat.checkSelfPermission(
this, Manifest.permission.ACCESS_FINE_LOCATION
) != PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(
this, Manifest.permission.ACCESS_COARSE_LOCATION
) != PackageManager.PERMISSION_GRANTED
) {
requestLocationPermission()
return
}
fusedLocationClient.lastLocation
.addOnSuccessListener { location ->
if (location != null) {
val latitude = location.latitude
val longitude = location.longitude
Toast.makeText(
this, "当前坐标: $latitude, $longitude", Toast.LENGTH_LONG
).show()
} else {
Toast.makeText(this, "无法获取当前位置", Toast.LENGTH_SHORT).show()
}
}
.addOnFailureListener { e ->
Toast.makeText(this, "获取位置失败: ${e.message}", Toast.LENGTH_SHORT).show()
}
}
3. 注意事项
- 权限策略:从 Android 12 开始,您需要声明应用为何需要位置权限 (
privacy-policy
)。 - 权限分级:如果只需要大致位置,建议申请
ACCESS_COARSE_LOCATION
以减少用户担忧。 - 电池优化:尽量减少位置请求的频率,使用
lastLocation
时可能不总是最新位置,必要时使用requestLocationUpdates()
。
如需进一步的定制功能(例如持续定位、后台定位),可以根据实际需求调整实现方式。