一、前言
通常,我们开发的应用,只需要使用一些系统定义好的资源,比如网络访问,外部文件读写,WIFI,SMS等监听权限,这些都只需要在AndroidManifest.xml中添加<user-permission>XXXXXX</user-permission>即可,但是,AndroidManifest.xml还有一个叫<permission>的tag,大家有考虑过该用法么?
二、授权与使用
其实,系统的那个权限,就是用的<permission>来定义好的,那么,谁要想使用,只需要对应的添加<user-permission>即可。
[html]
<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"] />
android:description: 描述这个权限所针对的操作及用户授予这个权限的后果
android:label: 权限的一个简短描述
android:name: 权限的唯一标识,一般都是使用 报名加权限名
android:permissionGroup: 权限所属权限组的名称
android:protectionLevel: 权限的等级
normal:
是最低的等级,声明次权限的app,系统会默认授予次权限,不会提示用户
dangerous:
权限对应的操作有安全风险,系统在安装声明此类权限的app时会提示用户
signature:
权限表明的操作只针对使用同一个证书签名的app开放
signatureOrSystem:
与signature类似,只是增加了rom中自带的app的声明
注:android:name 属性是必须的,其他的可选,未写的系统会指定默认值
三、用例子说话
我们举个例子,用Broadcast即广播来为例说明:
有两个APK,apkA端写了个BroadcastReceiver,用来接收"com.chris.test.ACTION_TEST",在apkB端,写了个发送这个广播的代码,请问:哪端定义权限,哪端使用权限?
当然是apkA端定义权限,而apkB端使用啦。
这里只例出apkA和apkB的AndroidManifest.xml就行啦:
apkA:
[html]
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.chris.test"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="10" />
<!-- 声明权限 -->
<permission android:name="com.chris.permission.BROADCAST_PERMISSION" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.chris.test.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 注册Broadcast Receiver,并指定了给当前Receiver发送消息方需要的权限 -->
<receiver
android:name="com.chris.test.MyReceiver"
android:permission="com.chris.permission.BROADCAST_PERMISSION" >
<intent-filter>
<action android:name="com.chris.test.ACTION_TEST" />
</intent-filter>
</receiver>
</application>
</manifest>
在apkA端声明,并指并BroadcastReceiver发送方的权限;
apkB:
[html]
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.chris.test.sender"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="10" />
<!-- 声明使用指定的权限 -->
<uses-permission android:name="com.chris.permission.BROADCAST_PERMISSION" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.chris.test.sender.MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />