1. 权限申请流程概述

本章定义 Runtime 权限申请流程的完整框架,明确其适用范围、核心目标,并分析该流程与操作系统权限模型之间的内在关系。通过本章学习,读者将建立对运行时权限申请的全局认知,为后续详细步骤奠定基础。

适用场景

  • 应用需要在运行时访问受保护资源(如相机、位置、麦克风、存储等)
  • 目标系统为 Android 6.0(API 23)及以上版本,且采用动态权限模型
  • 应用首次安装或升级后首次触发敏感权限使用
  • 用户曾经拒绝或“不再询问”授权后的再次申请
  • 多权限组合申请,或需要同时请求多个危险权限组

前置条件

  • 已在 AndroidManifest.xml 中声明所需权限(<uses-permission>)
  • 应用的 targetSdkVersion ≥ 23
  • 开发环境已集成 Android Support Library 或 AndroidX Activity Result API
  • 已明确业务场景对应的权限类型(普通、危险、特殊)

操作步骤(概览)

  1. 识别:在触发敏感功能前,确定需要申请的权限列表。
  2. 检查:调用 ContextCompat.checkSelfPermission() 判断当前授权状态。
  3. 解释(可选):若用户此前拒绝过,可展示说明理由的对话框。
  4. 申请:调用 ActivityCompat.requestPermissions() 或 Activity Result API 发起系统弹窗。
  5. 处理:在回调 onRequestPermissionsResult() 中根据授权结果执行相应逻辑。
  6. 兜底:若用户选择“不再询问”,引导用户前往系统设置手动开启。

输入输出物

类型输入物输出物
代码AndroidManifest 权限声明授权状态(GRANTED / DENIED)
API权限字符串(如 Manifest.permission.CAMERA)系统弹窗交互结果
日志用户操作行为(同意/拒绝/不再询问)决策记录(便于问题排查)

责任边界

  • 应用层:负责触发检查、发起申请、处理回调、展示UI引导。
  • 系统层:负责维护权限数据库、弹出系统授权对话框、记录用户选择。
  • 用户:拥有最终决定权,可随时在系统设置中撤销已授予的权限。

记录材料

  • 权限申请流程图(见下方SVG)
  • 权限声明清单(AndroidManifest.xml 摘录)
  • 授权回调日志(关键节点打点)
  • 用户拒绝/异常次数统计

异常处理

异常场景处理策略
用户拒绝权限降级使用(如无相机则隐藏拍照按钮)或提示功能受限
用户勾选“不再询问”弹出对话框引导用户前往系统设置手动开启
系统版本过低(< API 23)安装时自动授予,无需运行时申请
权限被系统策略限制捕获 SecurityException 并给出友好提示
连续多次拒绝考虑记录次数,适当降低申请频率或提供更详细的解释

验收标准

  • 所有需要运行时申请的权限均在首次触发前正确检查并请求
  • 用户拒绝后应用不崩溃,且提供降级路径
  • “不再询问”场景下能够正确跳转至系统设置页面
  • 权限状态变更(授予/撤销)时应用能及时响应并更新UI
  • 权限请求回调日志完整,可回溯用户决策过程
Runtime权限申请流程与操作系统权限模型关系图 业务层:识别权限需求 检查:checkSelfPermission 解释弹窗(可选) 申请:requestPermissions 处理回调 & 兜底 Android 权限模型 普通权限(自动授予) 危险权限(运行时申请) 特殊权限(系统设置) 业务申请与系统权限模型对应 说明 业务申请流程主要针对 危险权限与特殊权限。

关键提示:Runtime 权限申请流程只覆盖 危险权限 和 特殊权限。普通权限在安装时由系统自动授予,无需运行时申请。理解这一分层是设计正确申请策略的前提。