摘要:在android开发中,会碰到将组件对外暴漏的情况,具体哪些应用可以访问,可以自定义权限增加限制。

声明自定义权限

如果A应用需要被B应用访问,可以在A应用中声明 自定义权限,然后在B应用中申请该权限

在A应用Manifest文件中 声明权限

1
2
3
4
5
<permission
android:name="com.zsh.code.TEST"
android:description="custom permissions"
android:permissionGroup="com.zsh.code-group.TEST"
android:protectionLevel="normal" />

注意该标签 和同级 千万不要将其放在application标签下

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="appid">
<permission...>
<application...>
</manifest>

permission标签的属性

  1. name,该标签就是权限的名字。
  2. description,该标签就是权限的介绍。
  3. permissionGroup,非必填属性,可以将权限放在一个组中,但对于自定义权限,尽量不要设置此属性了。
  4. protectionLevel,指定保护级别。

Android将权限分为若干个保护级别,normal, dangerous, signature等。normal就是正常权限,该权限并不会给用户或者设备的隐私带来风险;dangerous就是危险权限,该级别的权限通常会给用户的数据或设备的隐私带来风险;signature指的是,只有相同签名的应用才能使用该权限

使用自定义权限

以一个Activity为例
如果一个activity需要被其他应用访问 需要把 exported 设置成true

1
2
3
4
5
<activity
android:name=".ui.MainActivity"
android:label="@string/app_name"
android:exported="true"
android:screenOrientation="portrait" />

这样该activity就能被其他应用调用了

加上已声明的权限 android:permission

1
2
3
4
5
6
<activity
android:name=".ui.MainActivity"
android:label="@string/app_name"
android:exported="true"
android:permission="com.zsh.code.TEST"
android:screenOrientation="portrait" />

在B应用中申请权限

1
<uses-permission android:name="com.zsh.code.TEST" />

这样 就可以在B应用中 访问A应用的MainActivity

注意:APK在是在安装过程中申请权限,如果 先安装B应用 ,在安装A应用,那么自定义权限将无效。