Myr*_*lav 8 location fusedlocationproviderclient android-12 android-api-31
在搭载 Android 12 (SPB5.210812.002) 的 Pixel 4a 上,当用户授予近似位置权限时,不会从FusedLocationProviderClient. 当我将权限更改为精确位置权限时,我就可以获取位置。
我在清单中拥有粗略和精细的位置权限,并在运行时请求这两种权限。
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Run Code Online (Sandbox Code Playgroud)
一旦获得任一许可,我就会请求lastKnownLocation以及位置更新。有了精确的位置许可,我很快就能获得位置,但当用户提供大致位置许可时就无法获得位置。
对于位置请求优先级,我已经尝试过LocationRequest.PRIORITY_HIGH_ACCURACY和LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY。
在 Android 9 上,一切都按预期工作,所以我猜这与Android 12 中引入的精确/近似位置权限有关。
这是我的代码的一部分:
private val fusedLocationClient by lazy {
LocationServices.getFusedLocationProviderClient(requireContext())
}
private val cts: CancellationTokenSource = CancellationTokenSource()
private val locationRequest = LocationRequest()
.setPriority(LOCATION_REQUEST_PRIORITY)
.setFastestInterval(MIN_TIME_BETWEEN_STAMPS_IN_MILLIS) // 1000
.setInterval(TIME_BETWEEN_STAMPS_IN_MILLIS) // 10000
private val locationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult?) {
locationResult?.locations?.firstOrNull()?.let {
userLocation = it
onUserLocationUpdated()
}
}
}
private fun onLocationPermissionGranted() {
if (!requireContext().isLocationEnabled()) {
requireContext().showLocationPermissionRequiredDialog {
onBackPressed()
}
} else {
try {
getCurrentLocation()
fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper())
} catch (t: Throwable) {
onBackPressed()
}
}
}
private fun getCurrentLocation() {
fusedLocationClient.getCurrentLocation(
LOCATION_REQUEST_PRIORITY,
cts.token
).addOnSuccessListener { location: Location? ->
if (location != null) {
userLocation = location
onUserLocationUpdated()
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 0
在 Android 12(API 级别 31)或更高版本上,用户可以请求您的应用仅检索大致位置信息,即使您的应用请求 ACCESS_FINE_LOCATION 运行时权限也是如此。
要处理这种潜在的用户行为,请勿单独请求 ACCESS_FINE_LOCATION 权限。相反,请在单个运行时请求中同时请求 ACCESS_FINE_LOCATION 权限和 ACCESS_COARSE_LOCATION 权限。
如果您尝试仅请求 ACCESS_FINE_LOCATION,系统会在 Android 12 的某些版本上忽略该请求。如果您的应用面向 Android 12 或更高版本,系统会在 Logcat 中记录以下错误消息:
ACCESS_FINE_LOCATION 必须与 ACCESS_COARSE_LOCATION 一起请求。
你可以在Android官方文档中找到它:
https://developer.android.com/training/location/permissions
| 归档时间: |
|
| 查看次数: |
4093 次 |
| 最近记录: |