ACCESS_BACKGROUND_LOCATION 不适用于低于 Q (29) Android 的版本

ACCESS_BACKGROUND_LOCATION Not Working on Lower Than Q (29) Android Versions

我的应用针对 Android API 28.

根据 documentation,我应该在 Android 运行 上请求 ACCESS_BACKGROUND_LOCATION 以及 ACCESS_FINE_LOCATION < 29

我试过这样做,但在 onRequestPermissionResults() 中,ACCESS_BACKGROUND_LOCATION 从未被授予并且 returns PackageManager.PERMISSION_DENIED。我的印象是,在 < 29.

上请求另一个前台权限时,这将被隐式授予

或者,我可以从 API < 29 的请求中删除权限,一切似乎都按预期工作,但我意识到我会违反文档。

问题

我可以在 Android 版本 < 29 上省略对 ACCESS_BACKGROUND_LOCATION 的明确请求,并且仍然按预期工作,同时符合 API 29 中的文档吗?

文档指出:

If your app targets Android 10 (API level 29) or lower, complete the following steps to request ACCESS_BACKGROUND_LOCATION:

  1. Include the ACCESS_BACKGROUND_LOCATION permission, as well as either the ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission, in your app's manifest.

  2. Request the ACCESS_BACKGROUND_LOCATION permission, as well as one of the other location permissions: ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION. You can request these permissions in a single operation.

这有点模棱两可,因为他们没有提到具体如何实现,但是 ACCESS_BACKGROUND_LOCATION 是在 API 29 中添加的,所以它不存在于 API 28岁及以下。

显然过去不是这种情况,但现在如果您尝试将它用于较低的 API 级别,您会收到警告:

您可以在 API 28 或更低时忽略对 ACCESS_BACKGROUND_LOCATION 的请求:

private fun requestLocationPermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        ActivityCompat.requestPermissions(
                this,
                arrayOf(
                        Manifest.permission.ACCESS_FINE_LOCATION,
                        Manifest.permission.ACCESS_BACKGROUND_LOCATION
                ),
                MY_PERMISSIONS_REQUEST_LOCATION
        )
    } else {
        ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
                MY_PERMISSIONS_REQUEST_LOCATION
        )
    }
}

此处提供完整代码: