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

Android 如何授予自定义非运行时权限?,android,android-contentprovider,android-permissions,Android,Android Contentprovider,Android Permissions,在launcher应用程序中,我们拥有用于内容提供商的自定义“正常”权限: <permission android:name="com.yandex.permissions.launcher.READ_BADGE_SETTINGS" android:permissionGroup="android.permission-group.SYSTEM_TOOLS" android:protectionLevel="normal" android:label="@s

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

<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安装并尝试访问提供程序后,会出现
安全异常
(无论我尝试使用哪种方法:
查询
插入
更新
删除
,甚至
调用

试图通过
grantUriPermission
授予权限根本没有帮助

有没有办法在运行时请求“正常”级别的权限?

“正常”级别的权限是由操作系统在安装时授予的,我们无法使用权限模型在运行时请求权限。但是,您可以在启动器的
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);
Uri=Uri.parse(“内容:”);
意图=新意图();
intent.setAction(注意动作视图);//设置自定义意图操作
intent.setFlags(intent.FLAG\u活动\u新任务);
intent.addFlags(intent.FLAG\授予\读取\ URI\权限);
addFlags(intent.FLAG\u GRANT\u WRITE\u URI\u权限);
intent.setData(uri);
星触觉(意向);
这将通过Intent授予权限。只需要检查一件事:如果没有安装
app
,而您只安装了
launcher
,该怎么办

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

您将面临“鸡和蛋”类型的问题。如果启动器定义了权限,但未首先安装,则系统根本不知道该权限。在这种情况下,当安装使用权限的应用程序时,系统会忽略这些权限,因为它们不存在

如果你仔细想想,这是有道理的。否则,恶意应用程序可能会在您的启动器之前安装,并像启动器一样定义自定义权限,从而有效地伪造应用程序的权限

如果在系统中定义并在应用程序清单的
标记中显示,则会自动授予正常权限。不需要运行时请求API