什么是“一次性权限”?它适用于哪些场景?

解读

面试官抛出此题,想确认两点:

  1. 你是否真的在 Android 10 以后的项目里调过权限 API,而不是只会背“AndroidManifest 写一行”。
  2. 面对国内无 GMS、厂商 ROM 魔改、用户手动回收权限等复杂环境,你是否知道“一次性”只是系统层面的承诺,实际落地还要做兼容性兜底。
    回答时要先给出官方定义,再立刻落到国内真机表现,最后给出业务层封装思路,体现“工程化落地”能力。

知识点

  1. 定义:从 Android 11(API 30)开始,系统对位置、麦克风、摄像头三大危险权限新增“仅限这一次”选项;用户选择后,应用进入后台 5 秒内权限被自动撤销,进程重启后权限消失。
  2. 与“前台服务”关系:若应用随后启动对应的前台服务(如定位服务),系统会再次弹窗提醒用户,防止后台偷录。
  3. 国内差异:
    • 华为/小米/OPPO 在 AOSP 基础上二次定制,部分 ROM 把“这次允许”翻译成“仅在使用期间允许”,但行为一致;
    • 无 GMS 设备上,权限自动撤销后不会走 Google 的“权限自动恢复”逻辑,因此国内 SDK 必须自己监听 onPermissionsChanged() 并重弹。
  4. 检测方法:
    • ActivityResultContracts.RequestPermission() 返回的 Map 中,若系统返回 shouldShowRequestPermissionRationale()==false 且权限被撤,即可判断为“一次性授权已失效”;
    • 后台监听 Intent.ACTION_PERMISSION_REVOKED(部分国产 ROM 未广播,需轮询 checkSelfPermission)。
  5. 适配套路:
    • UI 层提前埋点,记录用户是否点过“仅一次”,下次启动 Feature 时主动再弹;
    • 对定位场景,封装“权限+位置设置”双重检查,防止用户选了“仅一次”后又把系统定位开关关闭。

答案

一次性权限是 Android 11 针对麦克风、摄像头、精确位置引入的临时授权模式。用户选择“仅限这一次”后,应用仅在可见期间拥有权限;一旦进入后台超过 5 秒或进程被杀,系统立即回收权限,无需用户手动操作。
适用场景:

  1. 拍照识图、扫码付等“用完即走”功能,用户主观上只愿在操作时开放相机;
  2. 外卖、出行类 App 的“仅当次下单”定位需求,避免后台持续定位带来的电量与隐私顾虑;
  3. 语音输入、实时翻译等短时长麦克风调用,降低用户心理门槛。
    在国内项目中,需在获得权限后立刻执行业务,并在 onPause() 里把可复用的定位客户端、相机句柄全部释放;同时注册 OnPermissionsChangedListener,发现权限被撤后自动降级到“模糊定位”或提示用户重新授权,确保体验闭环。

拓展思考

  1. 如果业务必须“后台定位”,一次性权限无法满足,应引导用户到系统设置页把权限改为“始终允许”,并在 Google Play 审核或国内商店隐私问卷中提供“核心功能必须后台定位”的录屏说明,否则可能被拒审。
  2. 对于车载、Wear 等无人值守场景,一次性权限反而降低体验,可在首次启动时用“教育式弹窗”告诉用户“始终允许”才能解锁语音唤醒、停车找车等功能,把选择权前置。
  3. 结合 Jetpack Security 与 TEE,即使拿到一次性摄像头权限,也应在内存中只保存 NV21 帧,不落地原始照片;权限被撤后,立即清零 Buffer,减少合规审计风险。