如何授予自定义非运行时权限?附启动器应用自定义权限配置示例
自定义Normal权限授予指南
嘿,针对你问的自定义非运行时(normal级别)权限授予问题,我来给你梳理清楚~首先要明确:normal级别的权限属于Android系统自动授予的类型,不需要用户手动同意,也不用在代码里做运行时权限申请,只要配置正确,安装后系统就会自动搞定。结合你给出的权限声明,具体操作步骤如下:
1. 确认权限声明的正确性
你已经在Manifest里正确定义了两个normal权限,写法没问题,这里再贴出来方便对照:
<permission android:name="com.yandex.permissions.launcher.READ_BADGE_SETTINGS" android:permissionGroup="android.permission-group.SYSTEM_TOOLS" android:protectionLevel="normal" android:label="@string/permlab_read_badge_settings" android:description="@string/permdesc_read_badge_settings"/> <permission android:name="com.yandex.permissions.launcher.WRITE_BADGE_SETTINGS" android:permissionGroup="android.permission-group.SYSTEM_TOOLS" android:protectionLevel="normal"/>
重点是protectionLevel="normal",这是让系统自动授予的核心配置。
2. 给Content Provider绑定权限
如果你的Content Provider需要通过这些权限来限制访问,一定要在<provider>标签里指定对应的读写权限,示例如下:
<provider android:name=".your.package.YourBadgeSettingsProvider" android:authorities="com.yandex.launcher.badge.settings" android:readPermission="com.yandex.permissions.launcher.READ_BADGE_SETTINGS" android:writePermission="com.yandex.permissions.launcher.WRITE_BADGE_SETTINGS" android:exported="true"/>
android:exported="true":如果需要让其他APP访问这个Provider,必须设置为true;如果只是自己APP内部使用,可以设为false,更安全。- 权限名称要和你声明的完全一致,包括包名,不能有拼写错误。
3. 其他APP访问的配置
如果有第三方APP需要访问你的Content Provider,他们只需要在自己的Manifest里声明所需权限即可:
<!-- 声明读权限 --> <uses-permission android:name="com.yandex.permissions.launcher.READ_BADGE_SETTINGS"/> <!-- 需要写入的话再加上这个 --> <uses-permission android:name="com.yandex.permissions.launcher.WRITE_BADGE_SETTINGS"/>
因为是normal权限,第三方APP安装后系统会自动授予这些权限,不需要做任何运行时申请操作,直接调用Content Provider的方法就行。
4. 权限验证(可选)
虽然normal权限会自动授予,但你可以在代码里做个兜底检查,确保权限正常:
Java版本
// 检查读权限是否已授予 int readPermissionStatus = ContextCompat.checkSelfPermission( getApplicationContext(), "com.yandex.permissions.launcher.READ_BADGE_SETTINGS" ); if (readPermissionStatus == PackageManager.PERMISSION_GRANTED) { // 权限正常,执行Content Provider操作 } else { // 理论上normal权限不会走到这里,除非有特殊系统限制 }
Kotlin版本
val isReadPermissionGranted = ContextCompat.checkSelfPermission( applicationContext, "com.yandex.permissions.launcher.READ_BADGE_SETTINGS" ) == PackageManager.PERMISSION_GRANTED if (isReadPermissionGranted) { // 执行操作 }
额外注意事项
- 同一APP内部使用自己的Content Provider时,不需要在Manifest里声明
<uses-permission>,也不需要设置exported="true",默认拥有所有自定义权限。 - 不要随意修改
protectionLevel为dangerous,否则就需要按照危险权限的流程做运行时申请,不符合你当前的需求。
内容的提问来源于stack exchange,提问作者Nick Pakhomov




