android.content.pm.PermissionInfo#protectionLevel是表示權(quán)限級別的字段傻丝。下面這三個常量都是用來賦值給它的:
/**
* A normal application value for {@link #protectionLevel}, corresponding
* to the <code>normal</code> value of
* {@link android.R.attr#protectionLevel}.
*/
public static final int PROTECTION_NORMAL = 0;
/**
* Dangerous value for {@link #protectionLevel}, corresponding
* to the <code>dangerous</code> value of
* {@link android.R.attr#protectionLevel}.
*/
public static final int PROTECTION_DANGEROUS = 1;
/**
* System-level value for {@link #protectionLevel}, corresponding
* to the <code>signature</code> value of
* {@link android.R.attr#protectionLevel}.
*/
public static final int PROTECTION_SIGNATURE = 2;
什么時候會用到PermissionInfo這個類呢甘有?
接下來這段代碼會打印出當(dāng)前應(yīng)用所請求的權(quán)限:
try {
PackageManager packageManager = getPackageManager();
PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), PackageManager.GET_PERMISSIONS);
for (PermissionInfo p : packageInfo.permissions)
Log.d(TAG, p.toString());
} catch (PackageManager.NameNotFoundException e) {
throw new AssertionError(e);
}
注意,這里的權(quán)限不是我們最常用的AndroidManifest.xml文件里面<uses-permission/>標簽葡缰,而是<permission/>標簽:
<permission android:name="com.example.carol.playground.RESTART" />
<permission android:name="com.example.carol.playground..SHOPPING" />
簡單點講亏掀,<permission/>標簽是用來自定義權(quán)限的忱反。所以android:name的內(nèi)容可以隨便填。
順便說一下滤愕,<uses-permission/>標簽的內(nèi)容保存在PackageInfo的requestedPermissions字段里温算。
<permission/>標簽
我們先看一下<permission/>標簽的語法:
<permission android:description="string resource"
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permissionGroup="string"
android:protectionLevel=["normal" | "dangerous" | "signature"] />
android:protectionLevel對應(yīng)的就是android.content.pm.PermissionInfo#protectionLevel。
每種權(quán)限均有一個唯一的標簽標識间影。標簽通常指示受限制的操作注竿。以下是 Android 定義的一些權(quán)限:
android.permission.CALL_EMERGENCY_NUMBERS
android.permission.READ_OWNER_DATA
android.permission.SET_WALLPAPER
android.permission.DEVICE_POWER
如果應(yīng)用需要訪問受權(quán)限保護的功能,則必須在清單中使用<uses-permission>元素聲明應(yīng)用需要該權(quán)限魂贬。將應(yīng)用安裝到設(shè)備上之后巩割,安裝程序會通過檢查簽署應(yīng)用證書的頒發(fā)機構(gòu)并(在某些情況下)詢問用戶,確定是否授予請求的權(quán)限随橘。如果授予權(quán)限喂分,則應(yīng)用能夠使用受保護的功能。否則机蔗,其訪問這些功能的嘗試將會失敗蒲祈,并且不會向用戶發(fā)送任何通知。
應(yīng)用也可以使用權(quán)限保護自己的組件萝嘁。它可以采用由 Android 定義(如android.Manifest.permission中所列)或由其他應(yīng)用聲明的任何權(quán)限梆掸。它也可以定義自己的權(quán)限。新權(quán)限用 <permission>元素來聲明牙言。例如酸钦,Activity 可受到如下保護:
<manifest . . . >
<permission android:name="com.example.project.DEBIT_ACCT" . . . />
<uses-permission android:name="com.example.project.DEBIT_ACCT" />
. . .
<application . . .>
<activity android:name="com.example.project.FreneticActivity"
android:permission="com.example.project.DEBIT_ACCT"
. . . >
. . .
</activity>
</application>
</manifest>
請注意,在此示例中咱枉,DEBIT_ACCT權(quán)限不僅是通過<permission>元素來聲明卑硫,而且其使用也是通過 <uses-permission>元素來請求。要讓應(yīng)用的其他組件也能夠啟動受保護的 Activity蚕断,您必須請求其使用權(quán)限欢伏,即便保護是由應(yīng)用本身施加的亦如此。
同樣還是在此示例中亿乳,如果將permission屬性設(shè)置為在其他位置(例如android.permission.CALL_EMERGENCY_NUMBERS) 聲明的權(quán)限硝拧,則無需使用 <permission> 元素再次聲明。但是葛假,仍有必要通過 <uses-permission>請求其使用權(quán)限障陶。
<permission-tree>元素聲明為代碼中定義的一組權(quán)限聲明命名空間,<permission-group>為一組權(quán)限定義標簽聊训,包括在清單中使用 <permission>元素聲明的權(quán)限以及在其他位置聲明的權(quán)限抱究。這只影響如何對提供給用戶的權(quán)限進行分組。<permission-group>元素并不指定屬于該組的權(quán)限带斑,而只是為組提供名稱媳维∧鹧可通過向 <permission>元素的permissionGroup屬性分配組名,將權(quán)限放入組中侄刽。