美文网首页
Android权限级别android.content.pm.Pe

Android权限级别android.content.pm.Pe

作者: 吴晨 | 来源:发表于2017-08-25 16:40 被阅读449次

    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属性分配组名,将权限放入组中。

    相关文章

      网友评论

          本文标题:Android权限级别android.content.pm.Pe

          本文链接:https://www.haomeiwen.com/subject/bvqudxtx.html