android.content.pm.PermissionInfo#protectionLevel是表示权限级别的字段。下面这三个常量都是用来赋值给它的:
/**
* 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这个类呢?
接下来这段代码会打印出当前应用所请求的权限:
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);
}
注意,这里的权限不是我们最常用的AndroidManifest.xml文件里面<uses-permission/>标签,而是<permission/>标签:
<permission android:name="com.example.carol.playground.RESTART" />
<permission android:name="com.example.carol.playground..SHOPPING" />
简单点讲,<permission/>标签是用来自定义权限的。所以android:name的内容可以随便填。
顺便说一下,<uses-permission/>标签的内容保存在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对应的就是android.content.pm.PermissionInfo#protectionLevel。
每种权限均有一个唯一的标签标识。标签通常指示受限制的操作。以下是 Android 定义的一些权限:
android.permission.CALL_EMERGENCY_NUMBERS
android.permission.READ_OWNER_DATA
android.permission.SET_WALLPAPER
android.permission.DEVICE_POWER
如果应用需要访问受权限保护的功能,则必须在清单中使用<uses-permission>元素声明应用需要该权限。将应用安装到设备上之后,安装程序会通过检查签署应用证书的颁发机构并(在某些情况下)询问用户,确定是否授予请求的权限。如果授予权限,则应用能够使用受保护的功能。否则,其访问这些功能的尝试将会失败,并且不会向用户发送任何通知。
应用也可以使用权限保护自己的组件。它可以采用由 Android 定义(如android.Manifest.permission中所列)或由其他应用声明的任何权限。它也可以定义自己的权限。新权限用 <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权限不仅是通过<permission>元素来声明,而且其使用也是通过 <uses-permission>元素来请求。要让应用的其他组件也能够启动受保护的 Activity,您必须请求其使用权限,即便保护是由应用本身施加的亦如此。
同样还是在此示例中,如果将permission属性设置为在其他位置(例如android.permission.CALL_EMERGENCY_NUMBERS) 声明的权限,则无需使用 <permission> 元素再次声明。但是,仍有必要通过 <uses-permission>请求其使用权限。
<permission-tree>元素声明为代码中定义的一组权限声明命名空间,<permission-group>为一组权限定义标签,包括在清单中使用 <permission>元素声明的权限以及在其他位置声明的权限。这只影响如何对提供给用户的权限进行分组。<permission-group>元素并不指定属于该组的权限,而只是为组提供名称。可通过向 <permission>元素的permissionGroup属性分配组名,将权限放入组中。