在启动器应用中,我们拥有用于内容提供商的自定义“正常”权限:
<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
(我尝试使用哪种方法无关紧要:query
,insert
,update
,{{ 1}}甚至delete
)
尝试通过call
授予权限根本无济于事。
有没有办法在运行时请求“普通”级别权限?
答案 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
,该怎么办。
如果此方法不起作用,则解决方法是确保自定义权限同时具有权限组和“危险”保护级别。如果满足这些要求,系统将提供运行时权限请求支持。