Android 13 引入的“仅在使用期间”权限有何意义?
解读
国内面试官问这道题,并不是想听“更保护隐私”这种口号,而是考察两点:
- 你是否能把“前台+后台”拆成“前台精确、后台受限”这一粒度变化;
- 能否把变化落到工程侧:targetSdk 33 的适配清单、运行时弹窗文案、后台拉起 Service 的崩溃日志、厂商 ROM 差异、国内无 GMS 的替代方案。 答不到“代码怎么写、灰度怎么验、线上怎么防”这三个层次,基本会被判“只看过新闻,没做过适配”。
知识点
- 权限分级:普通权限、危险权限、特殊权限、仅在使用期间权限(foreground-only)。
- 前台定义:可见 Activity 或前台 Service(带 FGS 类型通知)。
- 后台禁用:离开前台 10 秒内核杀定位,再次使用需重新弹窗。
- 适配动作:
- AndroidManifest 中声明 android:foregroundServiceType="location|microphone|camera" 与对应权限;
- 运行时同时申请 ACCESS_FINE_LOCATION + ACCESS_COARSE_LOCATION,系统弹窗出现“仅在使用期间允许”;
- 若用户点选,后台启动 FGS 会抛 BackgroundServiceStartNotAllowedException,需在 onStartCommand 内检查 ActivityManager.RunningAppProcessInfo。
- 国内差异:小米/OPPO 在 13 上提前强制 targetSdk 33,后台定位直接返回 SecurityException;华为无 GMS,用 HMS Location Kit 的 setPermissionLocationScene 接口等价处理。
- 灰度验证:adb shell cmd appops get 包名 android:location 返回 fg 表示仅前台;后台场景用 Battery Historian 查看定位唤醒是否归零。
- 线上兜底:WorkManager 加 Constraints.Builder().setRequiredNetworkType(NETWORK_TYPE_NONE).setRequiresDeviceIdle(true) 把后台任务推迟到前台窗口;如业务强依赖,弹窗引导用户到设置页把权限升为“始终允许”,并用 Settings.ACTION_APPLICATION_DETAILS_SETTINGS 跳转。
答案
“仅在使用期间”权限是 Android 13 对 LOCATION、MICROPHONE、CAMERA 三类危险权限新增的细粒度授权选项,核心意义是把“前台可用”与“后台禁用”强制拆分开,让厂商可以在 Framework 层直接拦截后台访问,而无需各 ROM 各自魔改。对开发者而言,它把后台定位/录音/摄像从“弹窗一次永久可用”变成“必须保活前台 Service + 用户二次确认”,倒逼应用把后台任务改为前台任务或推迟任务,从而系统性降低耗电与隐私泄露。适配时,清单文件要声明前台 Service 类型,运行时先检查 PermissionChecker.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PERMISSION_GRANTED,再判断 AppOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_FINE_LOCATION, Process.myUid(), getPackageName()) == AppOpsManager.MODE_FOREGROUND;若后台场景仍需要定位,只能引导用户到系统设置把权限升为“始终允许”,否则捕获 SecurityException 做降级。
拓展思考
- 折叠屏大屏多窗口场景下,Activity 处于“可见但不可交互”的 paused 状态,系统仍判定为前台,此时“仅在使用期间”权限不会回收;但若用户分屏后把应用拖到小窗再点 Home,10 秒后就会触发后台限制,直播类 App 的“小窗继续推流”需要把 Service 声明为 mediaProjection + foregroundServiceType 组合,否则推流线程会被系统强制断掉。
- 国内推送 SDK 普遍用后台定位做“电子围栏唤醒”,在 Android 13 上直接失效。可行的替代方案是把围栏计算上移到云端,用 MQTT 长连通道下发围栏事件,客户端仅在前台时上报一次高精度位置,云端根据 GeoHash 网格匹配后回推消息,既绕过“仅在使用期间”限制,又符合工信部 26 号令对后台定位的合规要求。
- 车载系统(AAOS 13)对“仅在使用期间”权限做了车规级扩展:当车机处于“泊车”状态,系统把导航 App 的前台 Service 生命周期延长到 30 分钟,允许在停车场内继续记录轨迹;一旦车速大于 15 km/h 且用户未交互,则立即回收权限。导航厂商需在 CarService 的 DrivingStateCallback 里监听车速,动态启停 FGS,否则会被车厂 CTS 测试用例判定为异常耗电,无法过审。