【问题标题】:Android 12 doesn't return location with approximate location permissionAndroid 12 不会返回具有大致位置权限的位置
【发布时间】: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_ACCURACYLocationRequest.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


【解决方案1】:

在 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_COARSE_LOCATION 请求 ACCESS_FINE_LOCATION。

您可以在官方 Android 文档中找到它:

https://developer.android.com/training/location/permissions

【讨论】:

  • 是的,我在一个请求中同时请求:ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION。
猜你喜欢
  • 2014-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-10
  • 2017-09-20
  • 2017-09-23
相关资源
最近更新 更多