Android 12不返回粗略定位权限的位置信息。

8
在安卓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" />

请求获得精确/模糊位置权限后,我会请求lastKnownLocation,以及请求位置更新。

对于位置请求优先级,我尝试了LocationRequest.PRIORITY_HIGH_ACCURACYLocationRequest.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()
            }
        }
    }

1
我在Pixel 4上看到了同样的问题(相同的操作系统版本)。另外需要补充的是,使用相同的代码在Android 11和10上返回的位置信息都很好。 - Will
这里有一个小的后续,我收到了最新的安卓构建版本(SP1A.210812.015),一开始一切都正常。但是似乎过了一段时间后,同样的问题又出现了,为了解决它,你必须重新启动设备。我还没有计算过重启后多长时间事情能正常运行。 - Will
1
我认为在众多测试中,有一两次返回了大致位置许可的位置,但是:
  • 花费更长时间(约30-60秒);
  • 仅有一次回复,没有定期回复,尽管我已经订阅了。
- Myroslav
我遇到了同样的问题。在请求位置更新后,状态栏甚至没有显示位置图标,也没有收到任何位置信息。 - Kenneth Saey
@Mansi 老实说,我还没有解决这个问题。我知道有一个更新的版本 S2B3.220205.007.A1 可用,也许他们在这个版本中改变了一些东西,但我还没有自己检查过。 - Myroslav
显示剩余2条评论
1个回答

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


1
是的,我正在请求ACCESS_FINE_LOCATION和ACCESS_COARSE_LOCATION两个权限。 - Myroslav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接