【发布时间】:2026-02-21 08:30:02
【问题描述】:
我正在阅读关于declaring permissions in activity .根据文档
您可以使用清单的标签来控制哪些应用可以启动特定活动。除非两个活动在其清单中具有相同的权限,否则父活动无法启动子活动。如果您为特定活动声明元素,则调用活动必须具有匹配的元素。
为了尝试这一点,我创建了 2 个示例应用程序。第一个应用程序将尝试使用显式意图直接启动第二个应用程序的活动, 此外,第二个应用程序将为我从第一个应用程序启动的特定活动声明权限。
这些是我遵循的步骤
- 创建了 2 个应用程序(例如发送者和接收者)
- 在发件人的
Manifest中添加了<uses-permission android:name="permission.SHARE_POST"/>的权限 -
现在,通过单击 Sender App 的按钮,我正在调用名为
ShareActivity的 Receivers Activity,如下所示Intent intent = new Intent(); intent.setComponent(new ComponentName("basics.android.com.androidbasics","basics.android.com.androidbasics.ShareActivity")); startActivity(intent);注意:
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 的权限。但是我已经在发件人的清单中声明了它。
这里发生了什么事?
【问题讨论】:
-
两个应用程序是否都有定义
permission.SHARE_POST的<permission>元素? -
没有。只有发件人 App 有
<uses-permission android:name="permission.SHARE_POST"/>。两者都需要吗? Receiver 只在<activity>标签中定义android:permission="permission.SHARE_POST" -
如果您希望它们可以按任意顺序安装,它们都需要该元素。否则,必须先安装带有
<permission>的应用程序。请注意,自定义权限在 Android 4.4 及更低版本上确实很糟糕,因此我强烈建议这些应用的minSdkVersion为 21 或更高。 -
您可能混淆了
<permission>和<uses-permission>吗?请注意,它们是不同的东西,您链接的页面似乎没有提到<permission>,这是实际定义自定义权限所必需的。你也可以看看this page。 -
@MikeM。哦,是的!!,所以我混淆了
<permission>和<uses-permission>。现在,将接收器中的<uses-permission android:name="permission.SHARE_POST"/>更改为<permission android:name="permission.SHARE_POST" android:protectionLevel="normal" />。现在它开始工作了。但令人失望的是,Android 文档中没有适当的清晰度供初学者以正确的方式理解它。总之谢谢你。你节省了我很多时间!!`
标签: android android-intent android-activity android-permissions