ACCESS_BACKGROUND_LOCATION 在低于 Q (29) 版本的 Android 上无法正常工作。

6

我的应用程序的目标是Android API 28。

根据文档,当在运行时使用Android API <29时,我应该请求ACCESS_FINE_LOCATIONACCESS_BACKGROUND_LOCATION

我已经尝试过这样做,但是在onRequestPermissionResults()中,ACCESS_BACKGROUND_LOCATION从未被授予,并且返回PackageManager.PERMISSION_DENIED。我认为只要在<29的前台权限上请求,就会隐式地授予此权限。

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

问题

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


ACCESS_BACKGROUND_LOCATION 在 API 29 中添加,因此在 API 28 及更低版本中不存在。文档可能在谈论运行于 Android 10 或 11 时会发生什么,但并不是非常清楚。当您进行测试时,自动拒绝的是哪个 Android 版本? - Daniel Nugent
我正在使用API 29进行编译,但目标是API 28。在测试时,我主要测试了23,当然也测试了29 - StuStirling
有趣。我本来期望它会在23被拒绝,但不会在29被拒绝。 - Daniel Nugent
抱歉我表达不够清晰。您的期望是正确的。在23上被拒绝,但在29上按预期工作。我不知道您是否已经查看了我上面提供的文档,但它明确说明要在请求中显式包含权限。 - StuStirling
啊,那就有道理了。在 API 28 及以下版本中,由于权限在这些 Android 版本的代码中不存在,因此它基本上是无操作的。 - Daniel Nugent
@DanielNugent,能否请您写出一个答案,我会接受它。我相信您是正确的,只是文档不清晰且误导人。 - StuStirling
1个回答

6
文档说明:
如果您的应用程序针对Android 10(API级别29)或更低版本,请完成以下步骤请求ACCESS_BACKGROUND_LOCATION:
1.在应用程序清单中包括ACCESS_BACKGROUND_LOCATION权限以及ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION权限之一。
2.请求ACCESS_BACKGROUND_LOCATION权限以及其中一个其他位置权限:ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION。您可以在单个操作中请求这些权限。
这有点含糊不清,因为他们没有提到如何实现的具体细节,但ACCESS_BACKGROUND_LOCATION是在API 29中添加的,因此在API 28及更低版本中不存在。
显然,过去情况并非如此,但现在如果您尝试在较低的API级别中使用它,则会收到警告:

enter image description here

在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
        )
    }
}

完整的代码可以在这里找到:https://dev59.com/QlkS5IYBdhLWcg3wRUgU#40142454


4
抱歉,我不认为我同意你的答案。因为在低于29的版本中,当你请求“ACCESS_BACKGROUND_LOCATION”权限时,会被拒绝。因此你确实需要进行API级别的检查。你可以在旧版本上忽略它,或者根本不请求该权限。 - StuStirling
1
明白了。我没意识到你需要API版本检查。已更新答案,请告诉我现在是否正确! - Daniel Nugent

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