Android 如何授予自定义非运行时权限?
在launcher应用程序中,我们拥有用于内容提供商的自定义“正常”权限: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
<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