19、Android 10+适配:后台位置权限、ACCESS_BACKGROUND_LOCATION、隐私政策合规

说实话,Android 10 这一刀砍得挺狠的。我记得刚接到适配任务时,心里还嘀咕「不就是个定位权限吗,能有多复杂?」结果一上手才发现,后台位置权限这块水太深了。今天我就把这块内容掰开揉碎了讲清楚,顺便聊聊我在项目中踩过的坑。

19.1 为什么后台位置权限这么敏感?

你想想看,一个 App 能在后台偷偷获取你的位置,这本身就是件挺吓人的事。Google 也意识到了这点,所以在 Android 10(API 29)开始,把位置权限拆成了两个:

  • 前台位置权限ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION
  • 后台位置权限ACCESS_BACKGROUND_LOCATION

说白了,前台权限只允许 App 在前台运行时获取位置。一旦切到后台,系统就会停止位置更新。如果你需要后台持续定位(比如运动追踪、打车软件),就必须单独申请后台权限。

核心要点:Android 10+ 上,前台和后台权限是分开的。你不能只申请一个前台权限就指望后台也能用。

19.2 权限声明与申请流程

先看 Manifest 里怎么声明。嗯,这里要注意,后台权限不能单独存在,必须搭配前台权限一起声明:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

申请流程上,我个人习惯分两步走:

  1. 先申请前台权限(ACCESS_FINE_LOCATION
  2. 用户同意后,再申请后台权限(ACCESS_BACKGROUND_LOCATION

为什么不能一次申请完?因为 Google Play 的政策要求你必须向用户解释清楚「为什么需要后台定位」。一次性弹两个权限对话框,用户很容易直接拒绝。

小技巧:在申请后台权限前,先弹一个自定义的说明对话框,告诉用户「我们会在后台持续追踪你的位置,用于记录运动轨迹」。这样用户心里有数,同意率会高不少。

19.3 代码实现:分步申请权限

直接上代码,这是我项目里实际用过的方案:

// 第一步:检查前台权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
        != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
            REQUEST_FOREGROUND_LOCATION);
    return;
}

// 第二步:前台权限已获取,检查后台权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_BACKGROUND_LOCATION)
            != PackageManager.PERMISSION_GRANTED) {
        // 先弹自定义对话框解释原因
        showBackgroundLocationRationale();
        // 然后申请后台权限
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.ACCESS_BACKGROUND_LOCATION},
                REQUEST_BACKGROUND_LOCATION);
    }
}

这里有个坑,我曾经踩过:在 Android 11 上,如果用户连续两次拒绝后台权限,系统会把你的 App 标记为「不再询问」。这时候你再弹申请对话框也没用,只能引导用户去系统设置里手动开启。

注意:Android 11 引入了「一次性权限」和「自动重置权限」机制。如果用户选择了「仅本次允许」,下次启动时权限会被自动撤销。你的代码必须能处理这种状态变化。

19.4 隐私政策合规要求

这块其实比技术实现更头疼。Google Play 对后台位置权限的审核非常严格。我有个朋友的项目就因为隐私政策写得含糊,被拒了三次才过。

合规要点总结如下:

要求 说明
明确说明用途 隐私政策里必须写清楚「为什么需要后台定位」,不能含糊其辞
数据收集范围 说明收集哪些数据(经纬度、时间戳等),以及数据保留期限
第三方共享 如果位置数据会分享给第三方(比如地图SDK),必须列出第三方名称
用户控制权 提供关闭后台定位的入口,让用户能随时撤回授权
视频演示 Google Play 要求提交一个短视频,展示 App 如何使用后台定位

我个人建议,隐私政策里最好单独开一个章节叫「位置信息使用说明」,把上面这些内容一条条列清楚。别想着糊弄过去,Google 的审核团队现在精得很。

19.5 知识体系总览

下面这张图是我整理的后台位置权限适配全流程,你可以对照着检查自己的项目:

Android 10+ 后台位置权限适配流程 Manifest 声明权限 申请前台权限 (ACCESS_FINE_LOCATION) 用户同意 → 继续 用户拒绝 → 降级处理 申请后台权限 (ACCESS_BACKGROUND_LOCATION) 隐私政策合规说明 后台定位功能正常使用

19.6 避坑指南

最后分享几个我实际踩过的坑,希望能帮你省点时间:

  • 不要依赖 onRequestPermissionsResult 的返回值:在 Android 11 上,如果用户勾选了「不再询问」,这个回调可能不会触发。建议结合 shouldShowRequestPermissionRationale 做二次判断。
  • 后台定位在 Android 12 上又有变化:引入了「粗略位置」的概念,如果你的 App 不需要精确位置,可以考虑只用 ACCESS_COARSE_LOCATION 加后台权限,审核会更容易通过。
  • 测试时记得用真机:模拟器上后台定位的行为和真机不完全一致。我曾经在模拟器上测得好好的,上了生产才发现某些机型上后台定位会莫名其妙停止。
  • 电量优化是个隐形杀手:很多厂商(华为、小米、OPPO)有自己的省电策略,即使你拿到了后台权限,系统也可能在后台杀掉你的定位服务。建议引导用户把 App 加入「受保护应用」列表。

我的经验:在适配后台位置权限时,别只盯着 Google 的官方文档。多看看各大厂商的适配指南,尤其是华为和小米的。它们对后台权限的限制比原生 Android 更严格。

好了,关于 Android 10+ 的后台位置权限适配,核心内容就这些。说白了,技术实现并不复杂,真正的难点在于合规和用户体验。你想想看,用户凭什么信任你,让你在后台一直盯着他的位置?所以,把隐私政策写清楚,把申请理由说明白,比写代码更重要。

公众号:蓝海资料掘金营,微信deep3321