在Android 系统中,每个应用在安装时,都会声明自己所拥有的权限,权限管理模块通过管理每个应用所拥有的权限,就可以在其他应用在不具备某项权限的时候对某些危险性操作进行保护,同时系统不允许在应用运行过程中新添权限
Android权限的配置位置在AndroidManifest.xml中,相关配置元素有
<uses-permission>用于向Android 系统申请权限
<permission>用于在Android 系统中注册新权限
<permission-tree>支持动态在权限树中增加权限(我经过多次的测试,发现这个权限树仅能向系统申请尚未定义的权限,如果向系统申请已有权限会直接报错,暂时没有找到应用的地方,有知道的朋友请告诉我一下)
<permission-group>用户自定义权限组
自定义权限的意义:
平时我们通过<uses-permission>可以向Android系统申请权限,但这些权限是系统早已固化的。当我们希望有条件的分享我们应用中的某个组件,并只允许某些应用对其进行调用时,我们就需要对其设置自定义权限,只允许部分应用适用,以防止其被没有权限的应用所调取。
对于自定义权限,首先我们应做的是向系统告知我们新建了一个权限,其格式如下:
<permission android:description="string resource"
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permissionGroup="string"
android:protectionLevel=["normal" | "dangerous" |
"signature" | "signatureOrSystem"] />
然后,我们为需要保护的应用组件设置权限,在<acitivity>、<service>、<provider>、<receiver>标签中添加属性android:permission。例如:
<activity
android:name="com.kifile.test.permission.permissionserver.StaticActivity"
android:label="@string/title_activity_static"
android:permission="com.kifile.test.permission.statictest" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>
值得注意的是,我们需要在Activity中添加一个意图过滤器,android.intent.action.MAIN。添加了这个意图过滤器之后,系统才会允许我们将这个Activity作为应用的启动入口。
这样一来,只有添加了相关<uses-permission>属性的应用才能够访问这些组件,例如:
<uses-permission android:name="com.kifile.test.permission.statictest"/>
有时候我们只希望自己的应用之间能够相互访问,这时候我们就应该为权限设置相应的protectionLevel。
常用的保护等级有:
值 | 意义 |
---|---|
"normal " | 系统默认值,所有具有权限的应用均可以访问。 |
"dangerous " | 一个高危险的权限,申请该权限的应用可以访问用户私人数据。申请权限进行操作的时候,系统应该告知用户。 |
"signature " | 只允许具有相同签名的应用访问 |
"signatureOrSystem " | 只允许系统应用或具有相同签名的应用访问 |