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

Stu*_*ing 4 android android-permissions

我的应用程序面向 Android API 28。

根据文档,我应该请求ACCESS_BACKGROUND_LOCATION,以及ACCESS_FINE_LOCATION在 Android API 上运行时< 29

我曾尝试这样做,但在onRequestPermissionResults(),ACCESS_BACKGROUND_LOCATION从未被授予并返回PackageManager.PERMISSION_DENIED。我的印象是,在 < 请求另一个前台权限时,这将被隐式授予29

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

我是否可以省略ACCESS_BACKGROUND_LOCATION对 Android 版本 < 29的显式请求,并且仍然按预期工作,同时符合有效的 API29中的文档?

Dan*_*ent 5

该文件指出:

如果您的应用面向 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 级别,则会收到警告:

在此处输入图片说明

您可以省略ACCESS_BACKGROUND_LOCATION对 API 28 或更低版本的请求:

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
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

此处提供完整代码:https : //stackoverflow.com/a/40142454/4409409

  • 抱歉,我想我不同意你的回答。您确实需要 API 级别检查,因为在低于 29 的情况下,当您请求“ACCESS_BACKGROUND_LOCATION”权限时,它会被拒绝。您要么需要在旧版本上忽略它,要么甚至不请求它。 (4认同)