Android自定义权限

一、自定义权限

  自定义权限,一般是考虑到应用共享组件时的安全问题。我们知道在四大组件 AndroidManifest 中注册的时候,添加 exported = "true" 这一属性节点,这样就可以使其被其他 App 所调用。但是我们希望只有被允许的App才能调用,这个时候可以考虑使用”自定义权限“来实现。我们定义提供组件的 App 为开放端,使用开放组件的 App 为接入端,用这两个概念来描述自定义权限。

  1. 开放端:在 AndroidManifest 的 manifest 节点下定义权限:

<permission
   android:name="com.sl.permission.aidl"
   android:description="@string/service_permission"
   android:permissionGroup="com.sl.permissions"
   android:protectionLevel="signature" />

  Permission 属性

  <1> name : 权限名称

  <2> description : 权限描述

  <3> permissionGroup : 指定权限属于的权限组

  <4> protectionLevel : 权限保护级别

  权限保护级别:

ProtectionLevel Desc
Normal                          这是最低风险的权限,如果应用声明了此权限,也不会提示安装应用的用户授权(例如,如果声明了定位权限,则应用到定位功能时,会明确提示用户,是否授予定位权限,但是protectionLevel为normal的不会明确提示,直接默认授予),系统直接默认该应用有此权限;
dangerous 这种级别的权限风险更高,拥有此权限可能会访问用户私人数据或者控制设备,给用户带来负面影响,这种类型的权限一般不会默认授权。
signature 这种权限级别,只有当发请求的应用和接收此请求的应用使用同一签名文件,并且声明了该权限才会授权,并且是默认授权,不会提示用户授权
signatureOrSystem                                              

这种权限级别是系统授权的系统应用或者相同签名的应用,一般避免使用该级别,因为 signature 已经能满足大部分需求。

  开放组件:添加 permission 属性为自定义的权限

 <service
      android:name=".BookManagerService"
      android:permission="com.sl.permission.aidl"
      android:exported="true">
      <intent-filter>
          <action android:name="com.sl.aidl" />
          <category android:name="android.intent.category.DEFAULT" />
      </intent-filter>
</service>

  2. 接入端:在 AndroidManifest 的 manifest 节点下使用自定义权限

  添加权限:

<uses-permission android:name="com.sl.permission.aidl" />

  调用开放组件:

Intent service = new Intent();
service.setAction("com.sl.aidl");
service.setPackage("com.sl.binderservice");
bindService(service, mConnection, Context.BIND_AUTO_CREATE);

  在接入端添加自定义的权限才能正常调用开放接口,否则就会出现下面这个错误,这也正好实现了过滤接入端的需求。

posted @ 2018-04-24 11:35  Spiderman.L  阅读(6001)  评论(0编辑  收藏  举报