什么是危险权限(Dangerous Permission)?请列举至少五种典型危险权限
解读
在国内 Android 面试中,这道题考察的是“安全模型”基本功。面试官想确认三件事:
- 能否准确区分“普通权限”与“危险权限”的判定标准;
- 是否知道危险权限必须走运行时动态授权流程,且国产 ROM 与 Google 原生在弹窗策略上有差异;
- 能否举出高频、易踩坑的真实案例,并说明如果拒绝授权后业务如何降级。
回答时切忌只背清单,要结合“运行时申请 + 国产机兼容 + 用户拒绝场景”展开,才能体现工程落地能力。
知识点
- 判定标准:涉及用户隐私或可能产生费用的权限,被 Google 划分为 dangerous,必须 targetSdk≥23 并在运行时调用 requestPermissions()。
- 授权模型:Android 6.0 以后采用“安装时默认拒绝 + 运行时弹窗”策略,国产 ROM(MIUI、EMUI、ColorOS 等)还会二次封装,出现“仅在使用中允许”“始终允许”“单次允许”三选项,需做兼容。
- 权限组概念:同一组的任一权限被授权后,同组其他权限自动授予;但 Android 10 起不再自动授予,需重新申请。
- 回调处理:onRequestPermissionsResult() 中不仅要判断 grantResults,还要处理“永久拒绝”场景,引导用户跳转到系统设置。
- 国内特殊点:华为无 GMS,权限弹窗由 HMS Core 接管;小米对后台定位额外增加“后台定位开关”,需双重检查。
答案
危险权限是 Android 6.0 引入的运行时权限模型中,涉及用户敏感隐私或可能产生经济成本的权限,应用必须在运行时通过系统弹窗向用户显式申请,用户可一次性、仅在使用期间或永久拒绝。
典型五种高频危险权限:
- READ_EXTERNAL_STORAGE(读存储)
- CAMERA(摄像头)
- ACCESS_FINE_LOCATION(精确定位)
- RECORD_AUDIO(麦克风录音)
- READ_CONTACTS(读取通讯录)
拓展思考
- Android 11 分区存储(Scoped Storage)下,READ_EXTERNAL_STORAGE 行为被重新定义,targetSdk≥30 时即使拿到权限也只能访问媒体文件,访问非媒体文件需用 SAF 或 MediaStore API,面试可延伸“如何兼容 QQ 文件分享场景”。
- 后台定位权限:Android 10 新增 ACCESS_BACKGROUND_LOCATION,需先拿到前台定位权限再二次申请;国产 ROM 把开关拆到“位置信息→应用→后台定位”三级菜单,拒绝率极高,工程上需采用“进入前台再请求后台”的阶梯授权策略。
- 权限拒绝后的业务降级:例如扫码功能被永久拒绝 CAMERA,可降级为“手动输入编号 + 图库识别”,并在 UI 层用 Snackbar 引导用户到设置页重新开启,体现产品体验思维。