Android 12中如何禁用targetSdkVersion 30应用的权限请求
targetSdkVersion=30的无界面Android 12应用静默权限配置方案
你的应用无交互界面、不上架Google Play,完全可以在不修改targetSdkVersion配置的前提下,禁用权限弹窗并提前授予所有所需权限,具体方案如下:
禁用系统权限弹窗的核心方法
系统运行时权限弹窗只会在应用主动调用requestPermissions()相关API时触发,不存在系统无理由自动弹出权限窗的情况:
- 直接移除应用代码中所有主动申请运行时权限的逻辑,不要在Application、Service等组件的生命周期中调用权限申请接口,从触发根源上杜绝弹窗出现。
- 针对targetSdkVersion=30的应用,Android 12系统不会在应用安装、首次启动阶段主动弹出权限申请窗,所有弹窗触发节点完全由应用自身逻辑控制,移除主动申请代码后不会出现任何权限相关的系统弹窗。
全量权限静默授予的可行方案
根据应用的部署场景,选择对应方案即可提前授予所有需要的相机、存储等权限,全程不需要用户交互:
方案1:系统预装场景(稳定性最高)
如果你的应用是定制ROM的内置应用,会被放到/system/priv-app/系统分区目录,只需要两步配置即可默认拿到所有权限:
- 在
AndroidManifest.xml中完整声明你需要的所有权限,示例:
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 按需补充其他业务需要的权限声明 -->
- 在ROM的权限默认授予配置文件中,将你的应用包名加入对应权限的白名单,设备首次启动时系统会自动为应用授予所有声明的权限,不需要任何交互操作。
方案2:adb/企业MDM部署场景(非预装)
如果应用是通过adb调试、企业设备管理渠道批量安装,不需要放入系统分区,可以通过以下方式授权:
- 单设备调试时,应用安装完成后直接通过adb执行静默授权命令,示例:
# 将<你的应用包名>替换为实际的应用包名 adb shell pm grant <你的应用包名> android.permission.CAMERA adb shell pm grant <你的应用包名> android.permission.READ_EXTERNAL_STORAGE adb shell pm grant <你的应用包名> android.permission.WRITE_EXTERNAL_STORAGE # 其余需要的权限按照相同格式执行grant命令即可
- 批量企业部署时,可以先将配套的MDM应用设置为设备所有者(Device Owner),通过MDM调用系统权限管理接口,批量为你的应用静默授予所有声明的权限,全程不会弹出任何提示。
方案3:特殊权限适配场景
如果需要使用普通授权方式无法授予的系统级管控权限,可以将应用使用对应设备的系统平台签名文件重签名,在Manifest中声明对应权限后,应用安装时系统会自动授予所有匹配签名级的权限,不会触发任何弹窗。
注意:由于你的应用targetSdkVersion固定为30,不需要额外适配Android 12新增的权限分组、隐私弹窗逻辑,只要提前通过上述方式完成授权,同时移除应用内所有主动申请权限的代码,应用即可正常访问相机、存储等各类媒体资源,运行全程不会出现权限请求弹窗。
内容的提问来源于stack exchange,提问作者Martin Denion
相关产品推荐
相关产品推荐

