一、自定义权限
1、自定义权限的作用
自定义权限,一般是考虑到应用共享组件时的安全问题。我们知道在四大组件 AndroidManifest中注册的时候,添加 exported = "true" 属性,这样就可以使其被其他 App 所调用。但是我们希望只有被允许的App才能调用,这个时候可以考虑使用”自定义权限“来实现。我们定义提供组件的App为开放端,使用开放组件的App为接入端,用这两个概念来描述自定义权限。
2、怎么自定义权限
1). 开放端:在 AndroidManifest 的 manifest 节点下定义权限:
<permission
android:name="com.sl.permission.aidl"
android:description="@string/service_permission"
android:permissionGroup="com.sl.permissions"
android:protectionLevel="signature" />
a、name : 权限名称
b、description : 权限描述
c、permissionGroup : 指定权限属于的权限组
d、protectionLevel : 权限保护级别。可以是以下值:
normal:这是最低风险的权限,如果应用声明了此权限,也不会提示安装应用的用户授权(例如,如果声明了定位权限,则应用到定位功能时,会明确提示用户,是否授予定位权限,但是protectionLevel为normal的不会明确提示,直接默认授予),系统直接默认该应用有此权限;
dangerous:这种级别的权限风险更高,拥有此权限可能会访问用户私人数据或者控制设备,给用户带来负面影响,这种类型的权限一般不会默认授权。
signature:这种权限级别,只有当发请求的应用和接收此请求的应用使用同一签名文件,并且声明了该权限才会授权,并且是默认授权,不会提示用户授权
signatureOrSystem:这种权限级别是系统授权的系统应用或者相同签名的应用,一般避免使用该级别,因为 signature 已经能满足大部分需求。
2)、开放组件:添加 permission 属性为自定义的权限,在组件的AndroidManifest 文件中添加android:permission属性
<service
android:name=".BookManagerService"
android:permission="com.permission.aidl"
android:exported="true">
<intent-filter>
<action android:name="com.demo.aidl" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<Service/>
3)、接入端:在 AndroidManifest 的 manifest 节点下使用自定义权限
<uses-permission android:name="com.permission.aidl" />
3、在Activity中使用自定义权限
1)、在被调用Activity所在项目的AndroidManifest 声明自定义权限
<permission android:name="com.permisson_activity"/>
2)、在被调用Activity的AndroidManifest 中使用android:permission属性设置权限
<activity
android:name=".launch_mode.LaunchStandard1Activity"
android:exported="true"
android:launchMode="standard"
android:permission="com.permisson_activity"/>
<activity
3)、在调用端的AndroidManifest中添加权限
<uses-permission android:name="com.permisson_activity"/>
如果不添加该权限,调用Activity时会报权限错误。
java.lang.SecurityException: Permission Denial: starting Intent { cmp=com.demo.activity/.launch_mode.LaunchStandard1Activity } from ProcessRecord{29852ce 3339:com.demo.anotherappactivity/u0a68} (pid=3339, uid=10068) requires com.permisson_activity
4)、在调用端启动Activity
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.demo.activity", "com.demo.activity.launch_mode.LaunchStandard1Activity"));
startActivity(intent);
4、在Service中使用自定义权限
Service中使用和Activity中使用一样,bindService和startService使用时一样的。
5、在BroadcastReceive中使用自定义权限
1)、谁有权限收我的广播
a、在发送广播时指定需要的权限
intent = new Intent();
intent.setAction("com.otherapp.receive");
sendBroadcast(intent, "com.permission.recv");
com.permission.recv就是权限,可以在AndroidManifest中声明,也可以不在AndroidManifest中声明
b、在需要接受该广播的Receive所在项目的AndroidManifest中添加权限
<uses-permission android:name="com.permission.recv"/>
2)、谁有权限给我发广播
a、在接受者所在项目的AndroidManifest中声明权限
<permission android:name="com.permission.send"/>
b、在接受者的AndroidManifest中添加权限,使用android:permission属性
<receiver
android:name=".OtherAppReceiver"
android:enabled="true"
android:exported="true"
android:permission="com.permission.send">
<intent-filter>
<action android:name="com.otherapp.receive"></action>
</intent-filter>
</receiver>
c、在发送广播的项目AndroidManifest中添加权限
<uses-permission android:name="com.permission.send"/>
d、发送广播
intent = new Intent();
intent.setAction("com.otherapp.receive");
sendBroadcast(intent);