19、Android 10+适配:后台位置权限、ACCESS_BACKGROUND_LOCATION、隐私政策合规
说实话,Android 10 这一刀砍得挺狠的。我记得刚接到适配任务时,心里还嘀咕「不就是个定位权限吗,能有多复杂?」结果一上手才发现,后台位置权限这块水太深了。今天我就把这块内容掰开揉碎了讲清楚,顺便聊聊我在项目中踩过的坑。
19.1 为什么后台位置权限这么敏感?
你想想看,一个 App 能在后台偷偷获取你的位置,这本身就是件挺吓人的事。Google 也意识到了这点,所以在 Android 10(API 29)开始,把位置权限拆成了两个:
- 前台位置权限:
ACCESS_FINE_LOCATION和ACCESS_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" />
申请流程上,我个人习惯分两步走:
- 先申请前台权限(
ACCESS_FINE_LOCATION) - 用户同意后,再申请后台权限(
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 知识体系总览
下面这张图是我整理的后台位置权限适配全流程,你可以对照着检查自己的项目:
19.6 避坑指南
最后分享几个我实际踩过的坑,希望能帮你省点时间:
- 不要依赖
onRequestPermissionsResult的返回值:在 Android 11 上,如果用户勾选了「不再询问」,这个回调可能不会触发。建议结合shouldShowRequestPermissionRationale做二次判断。 - 后台定位在 Android 12 上又有变化:引入了「粗略位置」的概念,如果你的 App 不需要精确位置,可以考虑只用
ACCESS_COARSE_LOCATION加后台权限,审核会更容易通过。 - 测试时记得用真机:模拟器上后台定位的行为和真机不完全一致。我曾经在模拟器上测得好好的,上了生产才发现某些机型上后台定位会莫名其妙停止。
- 电量优化是个隐形杀手:很多厂商(华为、小米、OPPO)有自己的省电策略,即使你拿到了后台权限,系统也可能在后台杀掉你的定位服务。建议引导用户把 App 加入「受保护应用」列表。
我的经验:在适配后台位置权限时,别只盯着 Google 的官方文档。多看看各大厂商的适配指南,尤其是华为和小米的。它们对后台权限的限制比原生 Android 更严格。
好了,关于 Android 10+ 的后台位置权限适配,核心内容就这些。说白了,技术实现并不复杂,真正的难点在于合规和用户体验。你想想看,用户凭什么信任你,让你在后台一直盯着他的位置?所以,把隐私政策写清楚,把申请理由说明白,比写代码更重要。