1、定义和声明定制权限
应用可以在其AndroidManifest.xml中定义自己专属的权限,具体的操作如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="stark.a.is.zhang.photogallery">
<!--利用permission属性,定义应用专属的权限-->
<!--protectionLevel定义了该权限的安全级别 -->
<permission android:name="stark.a.is.zhang.photogallery.Private"
android:protectionLevel="signature"/>
.....................
<!--定义了权限后,以正常的方式使用 -->
<uses-permission android:name="stark.a.is.zhang.photogallery.Private"/>
............
2、权限的安全级别
自定义权限必须指定android:protectionLevel属性值。
Android系统将根据protectionLevel属性确定自定义权限的使用方式。
目前android定义了四种安全级别:
1、normal
normal用于修饰低风险权限,只要在APK在AndroidManifest.xml中申请了就可以使用。
在APK安装时,可以看到相应的安全级别,但不需要用户确认授权。
2、dangerous
dangerous用于修饰高风险权限,APK使用这类权限时,系统会明确要求用户进行确认。
3、signature
signature安全级别表明,如果其它应用需要使用当前应用自定义的权限,
则必须使用和当前相同的key做签名认证。
对于仅限应用内部使用的权限,选择signature安全级别比较合适。
权限授予时,系统不会通知用户。
4、signatureOrSystem
主要针对系统应用之间的通信。
当在系统应用中,定义该安全级别的权限时,其它系统应用均可以申请该应用的授权。
对于普通应用(非系统),该权限的用途退化到与signature级别一致。
3、使用举例
例如,在应用中定义一个服务。
在AndroidManifest.xml中,指定启动服务必须要有上文定义的定制权限。
............
<service android:name=".service.JobPollService"
android:permission="stark.a.is.zhang.photogallery.Private"
android:exported="true"/>
............
此时,其它签名不一致的应用,即使知道了service的包名和类民,也无法利用startService的方式,显示启动该service。
此外,在发送接受广播时,Context中同样定义了如下接口:
..............
//要求广播接受器所在应用,必须有receiverPermission对应的权限
public abstract void sendBroadcast(@RequiresPermission Intent intent,
@Nullable String receiverPermission);
.............
//注册广播接受器,仅接受持有broadcastPermission的应用发出的广播
@Nullable
public abstract Intent registerReceiver(BroadcastReceiver receiver,
IntentFilter filter, @Nullable String broadcastPermission,
@Nullable Handler scheduler);
.............
通过这种方式,可以将广播的发送范围限制在具有相同权限的一组应用中,避免信息的泄露。