我在 Android 应用中无法准确检索用户位置,尤其是在较新的 Android 版本中。我根据 Stack Overflow 上的答案实施了一个解决方案,但是...
我在 Android 应用中无法准确检索用户位置,尤其是在较新的 Android 版本中。我根据 Stack Overflow 答案 ,但效果不如预期。
我不确定问题的根本原因。是由于最近的 Android 版本中位置权限处理方式的变更、我的代码中的权限实现不正确,还是 Stack Overflow 解决方案本身存在潜在问题?
您能否指导我解决此问题应采取的具体步骤,包括检查与权限相关的问题、验证位置服务和调试我的代码?
我特别感兴趣的是了解如何在较新的 Android 版本上正确处理位置权限以及任何可能解决兼容性问题的方法。
以下是我们在撰写时可以做到的方法
val cameraPermissionState = rememberPermissionState(Manifest.permission.ACCESS_FINE_LOCATION)
val requestPermissionLauncher = rememberLauncherForActivityResult(
ActivityResultContracts.RequestPermission()
) { isGranted ->
if (isGranted) {
// Permission granted
viewModel.fetchLocation()
} else {
// Handle permission denial
}
}
LaunchedEffect(cameraPermissionState) {
if (!cameraPermissionState.status.isGranted && cameraPermissionState.status.shouldShowRationale) {
//Show rational dialog explaining why app want this permission
} else {
requestPermissionLauncher.launch(Manifest.permission.ACCESS_FINE_LOCATION)
}
}
当然,我们必须像下面这样在清单中添加权限,否则它在这里也不会起作用。
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
以下是在 kotlin 中获取位置的主要逻辑
fun fetchLocation(context: Context) {
Log.d(TAG, "onLocationResult:TestLocation>>Searching")
val fusedLocationClient = LocationServices.getFusedLocationProviderClient(context as Activity)
val locationRequest = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10000)
.setWaitForAccurateLocation(true)
.setMinUpdateIntervalMillis(5000)
.setMaxUpdateDelayMillis(15000)
.build()
var locationCallback: LocationCallback? = null
locationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult) {
for (location in locationResult.locations) {
// Handle the received location object
val latitude = location.latitude
val longitude = location.longitude
Log.d(TAG, "onLocationResult:TestLocation>>$latitude,$longitude")
locationCallback?.let {
fusedLocationClient.removeLocationUpdates(it)
}
// ... use the location data
}
}
}
fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper())
}
与旧式 xml java 相比,在 kotlin compose 中,它变得非常简单