Android权限级别android.content.pm.PermissionInfo#protectionLevel

android.content.pm.PermissionInfo#protectionLevel是表示权限级别的字段。下面这三个常量都是用来赋值给它的:

/**
 * A normal application value for {@link #protectionLevel}, corresponding
 * to the normal value of
 * {@link android.R.attr#protectionLevel}.
 */
public static final int PROTECTION_NORMAL = 0;

/**
 * Dangerous value for {@link #protectionLevel}, corresponding
 * to the dangerous value of
 * {@link android.R.attr#protectionLevel}.
 */
public static final int PROTECTION_DANGEROUS = 1;

/**
 * System-level value for {@link #protectionLevel}, corresponding
 * to the signature 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文件里面标签,而是标签:



简单点讲,标签是用来自定义权限的。所以android:name的内容可以随便填。
顺便说一下,标签的内容保存在PackageInfo的requestedPermissions字段里。

标签

我们先看一下标签的语法:


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

如果应用需要访问受权限保护的功能,则必须在清单中使用元素声明应用需要该权限。将应用安装到设备上之后,安装程序会通过检查签署应用证书的颁发机构并(在某些情况下)询问用户,确定是否授予请求的权限。如果授予权限,则应用能够使用受保护的功能。否则,其访问这些功能的尝试将会失败,并且不会向用户发送任何通知。
应用也可以使用权限保护自己的组件。它可以采用由 Android 定义(如android.Manifest.permission中所列)或由其他应用声明的任何权限。它也可以定义自己的权限。新权限用 元素来声明。例如,Activity 可受到如下保护:


    
    
    . . .
    
        
            . . .
        
    

请注意,在此示例中,DEBIT_ACCT权限不仅是通过元素来声明,而且其使用也是通过 元素来请求。要让应用的其他组件也能够启动受保护的 Activity,您必须请求其使用权限,即便保护是由应用本身施加的亦如此。
同样还是在此示例中,如果将permission属性设置为在其他位置(例如android.permission.CALL_EMERGENCY_NUMBERS) 声明的权限,则无需使用 元素再次声明。但是,仍有必要通过 请求其使用权限。
元素声明为代码中定义的一组权限声明命名空间,为一组权限定义标签,包括在清单中使用 元素声明的权限以及在其他位置声明的权限。这只影响如何对提供给用户的权限进行分组。元素并不指定属于该组的权限,而只是为组提供名称。可通过向 元素的permissionGroup属性分配组名,将权限放入组中。

你可能感兴趣的:(Android权限级别android.content.pm.PermissionInfo#protectionLevel)