如何授予自定义非运行时权限?

时间:2018-04-18 12:39:11

标签: android android-contentprovider android-permissions

在启动器应用中,我们拥有用于内容提供商的自定义“正常”权限:

<permission
    android:name="com.yandex.permissions.launcher.READ_BADGE_SETTINGS"
    android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
    android:protectionLevel="normal"
    android:label="@string/permlab_read_badge_settings"
    android:description="@string/permdesc_read_badge_settings"/>

<permission
    android:name="com.yandex.permissions.launcher.WRITE_BADGE_SETTINGS"
    android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
    android:protectionLevel="normal"
    android:label="@string/permlab_write_badge_settings"
    android:description="@string/permdesc_write_badge_settings"/>

提供者本身:

<provider
        android:name="${applicationId}.badges.BadgeContentProvider"
        android:authorities="${applicationId}.badges;${applicationId}.badges_external"
        android:readPermission="com.yandex.permissions.launcher.READ_BADGE_SETTINGS"
        android:writePermission="com.yandex.permissions.launcher.WRITE_BADGE_SETTINGS"
        android:grantUriPermissions="true"
        android:exported="true">
    </provider>

有一个应用已声明在清单文件中使用这些权限:

<uses-permission android:name="com.yandex.permissions.launcher.READ_BADGE_SETTINGS"/>
<uses-permission android:name="com.yandex.permissions.launcher.WRITE_BADGE_SETTINGS"/>

每当在启动器之后安装应用程序时,访问内容提供程序都没有问题。

问题显示应用程序安装在启动器之前。安装Launcher并尝试访问提供程序后,SecurityException(我尝试使用哪种方法无关紧要:queryinsertupdate,{{ 1}}甚至delete

尝试通过call授予权限根本无济于事。

有没有办法在运行时请求“普通”级别权限?

2 个答案:

答案 0 :(得分:1)

你正面对鸡蛋和鸡蛋&#34;问题的类型。如果启动程序定义了权限并且未首先安装,则系统根本不知道该权限。在这种情况下,当安装了使用该权限的应用程序时,系统会忽略权限,因为它们不存在。

如果你考虑一下,这是有道理的。否则,可以在启动器之前安装恶意应用程序,并完全像启动程序那样定义自定义权限,从而有效地伪造应用程序的权限。

如果在系统中定义并存在于应用清单中的<uses-permissions>标记中,则会自动授予正常权限。没有必要的运行时请求API。

答案 1 :(得分:0)

&#34;正常&#34;操作系统在安装时授予级别权限,我们无法在运行时使用权限模型来请求权限。但是,您可以在Launcher的onCreate()

中执行以下操作
        Uri uri = Uri.parse("content:<your-content URI>");
        Intent intent = new Intent();
        intent.setAction(NOTE_ACTION_VIEW); // SET CUSTOM INTENT ACTION
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
        intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        intent.setData(uri);
        startActivity(intent);

这将通过Intent授予权限。只需要检查一件事:如果未安装app并且您只安装了launcher,该怎么办。

如果此方法不起作用,则解决方法是确保自定义权限同时具有权限组和“危险”保护级别。如果满足这些要求,系统将提供运行时权限请求支持。