什么是危险权限(Dangerous Permission)?请列举至少五种典型危险权限

解读

在国内 Android 面试中,这道题考察的是“安全模型”基本功。面试官想确认三件事:

  1. 能否准确区分“普通权限”与“危险权限”的判定标准;
  2. 是否知道危险权限必须走运行时动态授权流程,且国产 ROM 与 Google 原生在弹窗策略上有差异;
  3. 能否举出高频、易踩坑的真实案例,并说明如果拒绝授权后业务如何降级。
    回答时切忌只背清单,要结合“运行时申请 + 国产机兼容 + 用户拒绝场景”展开,才能体现工程落地能力。

知识点

  1. 判定标准:涉及用户隐私或可能产生费用的权限,被 Google 划分为 dangerous,必须 targetSdk≥23 并在运行时调用 requestPermissions()。
  2. 授权模型:Android 6.0 以后采用“安装时默认拒绝 + 运行时弹窗”策略,国产 ROM(MIUI、EMUI、ColorOS 等)还会二次封装,出现“仅在使用中允许”“始终允许”“单次允许”三选项,需做兼容。
  3. 权限组概念:同一组的任一权限被授权后,同组其他权限自动授予;但 Android 10 起不再自动授予,需重新申请。
  4. 回调处理:onRequestPermissionsResult() 中不仅要判断 grantResults,还要处理“永久拒绝”场景,引导用户跳转到系统设置。
  5. 国内特殊点:华为无 GMS,权限弹窗由 HMS Core 接管;小米对后台定位额外增加“后台定位开关”,需双重检查。

答案

危险权限是 Android 6.0 引入的运行时权限模型中,涉及用户敏感隐私或可能产生经济成本的权限,应用必须在运行时通过系统弹窗向用户显式申请,用户可一次性、仅在使用期间或永久拒绝。
典型五种高频危险权限:

  1. READ_EXTERNAL_STORAGE(读存储)
  2. CAMERA(摄像头)
  3. ACCESS_FINE_LOCATION(精确定位)
  4. RECORD_AUDIO(麦克风录音)
  5. READ_CONTACTS(读取通讯录)

拓展思考

  1. Android 11 分区存储(Scoped Storage)下,READ_EXTERNAL_STORAGE 行为被重新定义,targetSdk≥30 时即使拿到权限也只能访问媒体文件,访问非媒体文件需用 SAF 或 MediaStore API,面试可延伸“如何兼容 QQ 文件分享场景”。
  2. 后台定位权限:Android 10 新增 ACCESS_BACKGROUND_LOCATION,需先拿到前台定位权限再二次申请;国产 ROM 把开关拆到“位置信息→应用→后台定位”三级菜单,拒绝率极高,工程上需采用“进入前台再请求后台”的阶梯授权策略。
  3. 权限拒绝后的业务降级:例如扫码功能被永久拒绝 CAMERA,可降级为“手动输入编号 + 图库识别”,并在 UI 层用 Snackbar 引导用户到设置页重新开启,体现产品体验思维。