1. 权限申请流程概述
本章定义 Runtime 权限申请流程的完整框架,明确其适用范围、核心目标,并分析该流程与操作系统权限模型之间的内在关系。通过本章学习,读者将建立对运行时权限申请的全局认知,为后续详细步骤奠定基础。
适用场景
- 应用需要在运行时访问受保护资源(如相机、位置、麦克风、存储等)
- 目标系统为 Android 6.0(API 23)及以上版本,且采用动态权限模型
- 应用首次安装或升级后首次触发敏感权限使用
- 用户曾经拒绝或“不再询问”授权后的再次申请
- 多权限组合申请,或需要同时请求多个危险权限组
前置条件
- 已在 AndroidManifest.xml 中声明所需权限(
<uses-permission>) - 应用的
targetSdkVersion≥ 23 - 开发环境已集成 Android Support Library 或 AndroidX Activity Result API
- 已明确业务场景对应的权限类型(普通、危险、特殊)
操作步骤(概览)
- 识别:在触发敏感功能前,确定需要申请的权限列表。
- 检查:调用
ContextCompat.checkSelfPermission()判断当前授权状态。 - 解释(可选):若用户此前拒绝过,可展示说明理由的对话框。
- 申请:调用
ActivityCompat.requestPermissions()或 Activity Result API 发起系统弹窗。 - 处理:在回调
onRequestPermissionsResult()中根据授权结果执行相应逻辑。 - 兜底:若用户选择“不再询问”,引导用户前往系统设置手动开启。
输入输出物
| 类型 | 输入物 | 输出物 |
|---|---|---|
| 代码 | AndroidManifest 权限声明 | 授权状态(GRANTED / DENIED) |
| API | 权限字符串(如 Manifest.permission.CAMERA) | 系统弹窗交互结果 |
| 日志 | 用户操作行为(同意/拒绝/不再询问) | 决策记录(便于问题排查) |
责任边界
- 应用层:负责触发检查、发起申请、处理回调、展示UI引导。
- 系统层:负责维护权限数据库、弹出系统授权对话框、记录用户选择。
- 用户:拥有最终决定权,可随时在系统设置中撤销已授予的权限。
记录材料
- 权限申请流程图(见下方SVG)
- 权限声明清单(AndroidManifest.xml 摘录)
- 授权回调日志(关键节点打点)
- 用户拒绝/异常次数统计
异常处理
| 异常场景 | 处理策略 |
|---|---|
| 用户拒绝权限 | 降级使用(如无相机则隐藏拍照按钮)或提示功能受限 |
| 用户勾选“不再询问” | 弹出对话框引导用户前往系统设置手动开启 |
| 系统版本过低(< API 23) | 安装时自动授予,无需运行时申请 |
| 权限被系统策略限制 | 捕获 SecurityException 并给出友好提示 |
| 连续多次拒绝 | 考虑记录次数,适当降低申请频率或提供更详细的解释 |
验收标准
- 所有需要运行时申请的权限均在首次触发前正确检查并请求
- 用户拒绝后应用不崩溃,且提供降级路径
- “不再询问”场景下能够正确跳转至系统设置页面
- 权限状态变更(授予/撤销)时应用能及时响应并更新UI
- 权限请求回调日志完整,可回溯用户决策过程
关键提示:Runtime 权限申请流程只覆盖 危险权限 和 特殊权限。普通权限在安装时由系统自动授予,无需运行时申请。理解这一分层是设计正确申请策略的前提。