【发布时间】:2021-12-05 07:10:14
【问题描述】:
在搭载 Android 12 (SPB5.210812.002) 的 Pixel 4a 上,当用户授予大致位置权限时,FusedLocationProviderClient 不会返回任何位置。当我将权限更改为确切位置权限时,我就可以获取位置。
我在 Manifest 中同时拥有粗略和精细定位权限,并在运行时同时请求这两者。
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
一旦获得许可,我就会请求lastKnownLocation,并请求更新位置。
有了精确的位置权限,我很快就能得到位置,但当用户给出大致的位置权限时就不行了。
对于位置请求优先级,我尝试了LocationRequest.PRIORITY_HIGH_ACCURACY 和LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY。
在 Android 9 上一切正常,所以我猜这与 Android 12 中引入的precise/approximate location permission 有关。
这是我的代码的一部分:
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()
}
}
}
【问题讨论】:
-
我在像素 4(相同的操作系统版本)上看到了同样的东西。一个小补充,位置在 Android 11 和 10 上返回就好了,使用相同的代码。
-
这里的另一个小跟进,我收到了最新的 android 版本 (SP1A.210812.015),起初一切正常。但似乎过了一会儿,同样的问题又出现了,要解决这个问题,你必须重新启动设备。我还没有计算重启后工作多久。
-
我认为在许多测试中,有一次或两次返回位置并带有大致的位置权限,但它: - 花费了更长的时间(大约 30-60 秒); - 只是一次性回复,没有定期回复,即使我已经订阅了。
-
我也有同样的情况。请求位置更新后,状态栏甚至没有显示位置图标,并且根本没有收到任何位置。
-
@Myroslav 你能告诉我你是如何解决这个问题的吗?
标签: location fusedlocationproviderclient android-12 android-api-31