一、前言
通常,我們開發的應用,只需要使用一些系統定義好的資源,比如網絡訪問,外部文件讀寫,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" />
</intent-filter>
</activity>
</application>
</manifest>
在apkB端添加個使用權限即可。