我正在读关于在活动中声明权限 https://developer.android.com/guide/components/activities/intro-activities#dp。根据文档
您可以使用清单的标签来控制哪些应用程序可以启动特定活动。父活动无法启动子活动,除非两个活动在其清单中具有相同的权限。如果您为特定活动声明一个元素,则调用活动必须有一个匹配的元素。
为了尝试这个,我创建了 2 个示例应用程序。第一个应用程序将尝试直接启动第二个应用程序的活动,使用明确的意图,
此外,第二个应用程序将声明我从第一个应用程序启动的特定活动的权限。
这些是我遵循的步骤
- 创建了 2 个应用程序(例如发送者和接收者)
- 添加了权限
<uses-permission android:name="permission.SHARE_POST"/>
in the Manifest
发件人的
-
现在,通过单击发送者应用程序的按钮,我正在调用名为的接收者活动ShareActivity
如下
Intent intent = new Intent();
intent.setComponent(new ComponentName("basics.android.com.androidbasics","basics.android.com.androidbasics.ShareActivity"));
startActivity(intent);
NOTE: basics.android.com.androidbasics
是接收者的包名
-
下面给出的是第二个应用程序(接收者)清单中的活动声明
<activity
android:name=".ShareActivity"
android:exported="true"
android:permission="permission.SHARE_POST"/>
现在,当我运行这两个应用程序并尝试启动时ShareActivity
从发件人处,我收到以下错误
Caused by: java.lang.SecurityException: Permission Denial: starting Intent { cmp=basics.android.com.androidbasics/.ShareActivity } from ProcessRecord{e09a1fc 26267:sender.android.com.sender/u0a925} (pid=26267, uid=10925) requires permission.SHARE_POST
好像发件人没有权限permission.SHARE_POST
然而。但我已经在发件人清单中声明了。
这里发生了什么事?
在 Android 中使用自定义权限是相当高级的事情。基本配方是:
- 决定您想要的权限名称。它在设备上必须是唯一的。所以,
permission.SHARE_POST
不是一个好的选择 - 添加与您的域名或您用作应用程序基础的任何其他名称相关联的前缀applicationId
values.
- 在使用权限保护自己的应用程序中,声明一个
<permission>
元素,具有android:name
属性保存步骤 #1 中的权限名称。或者,给它一个android:protectionLevel
属性(例如,signature
,因此只有由相同签名密钥签名的应用程序才能协同工作)。
- 在使用权限保护自己的应用程序中,添加
android:permission
组件上的属性(例如,<activity>
),值为步骤 #1 中的权限名称。
- 在希望与步骤 #3 中的应用程序进行通信的应用程序中,添加
<uses-permission>
属性,带有一个android:name
属性保存步骤 #1 中的权限名称。
- 在这两个应用程序中,设置您的
minSdkVersion
到 21,因为旧版本上的自定义权限存在安全问题。
如果防御者(步骤 #2 和 #3)始终在客户端(步骤 #4)之前安装,那么这将起作用。如果您希望应用程序可以按任一顺序安装,请将上面的步骤 #2 替换为:
-
In both apps,声明一个
<permission>
元素,具有android:name
属性保存步骤 #1 中的权限名称。或者,给它一个android:protectionLevel
属性(例如,signature
,因此只有由相同签名密钥签名的应用程序才能协同工作)。另外,请确保两个应用程序始终由相同的签名密钥签名,否则它们不能同时定义相同的权限。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)