Android:java.lang.SecurityException:权限拒绝:启动意图
Posted
技术标签:
【中文标题】Android:java.lang.SecurityException:权限拒绝:启动意图【英文标题】:Android: java.lang.SecurityException: Permission Denial: start Intent 【发布时间】:2011-05-08 22:14:48 【问题描述】:我创建了一个包含 GWVectraNotifier 活动的应用程序,该活动被其他应用程序调用以显示通知。
在通知对话框中,会有“显示”按钮和“关闭”按钮。
点击“显示”按钮,会启动相应的活动。
要检查上述应用程序的功能,
我在检查邮件事件触发器上从 K9Mail 应用程序启动了 GWVectraNotifier 活动。
我能够成功启动 GWVectraNotifier 活动,但单击“显示”按钮我将不得不启动 K9mail 的“消息列表”活动。为此,我编写了以下代码:
Intent i = new Intent();
i.setComponent(new ComponentName("com.fsck.k9", "com.fsck.k9.activity.MessageList"));
i.putExtra("account", accUuid);
i.putExtra("folder", accFolder);
startActivity(i);
抛出:
WARN/ActivityManager(59): Permission denied: checkComponentPermission() reqUid=10050
WARN/ActivityManager(59): Permission Denial: starting Intent cmp=com.fsck.k9/.activity.MessageList (has extras) from ProcessRecord43f6d7c8 675:com.i10n.notifier/10052 (pid=675, uid=10052) requires null
WARN/System.err(675): java.lang.SecurityException: Permission Denial: starting Intent cmp=com.fsck.k9/.activity.MessageList (has extras) from ProcessRecord43f6d7c8 675:com.i10n.notifier/10052 (pid=675, uid=10052) requires null
WARN/System.err(675): at android.os.Parcel.readException(Parcel.java:1247)
WARN/System.err(675): at android.os.Parcel.readException(Parcel.java:1235)
WARN/System.err(675): at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1298)
WARN/System.err(675): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1373)
WARN/System.err(675): at android.app.Activity.startActivityForResult(Activity.java:2817)
WARN/System.err(675): at android.app.Activity.startActivity(Activity.java:2923)
WARN/System.err(675): at com.i10n.notifier.GWVectraNotifier$2$1.run(GWVectraNotifier.java:63)
WARN/System.err(675): at android.app.Activity.runOnUiThread(Activity.java:3707)
WARN/System.err(675): at com.i10n.notifier.GWVectraNotifier$2.onClick(GWVectraNotifier.java:53)
WARN/System.err(675): at android.view.View.performClick(View.java:2408)
WARN/System.err(675): at android.view.View$PerformClick.run(View.java:8816)
WARN/System.err(675): at android.os.Handler.handleCallback(Handler.java:587)
WARN/System.err(675): at android.os.Handler.dispatchMessage(Handler.java:92)
WARN/System.err(675): at android.os.Looper.loop(Looper.java:123)
WARN/System.err(675): at android.app.ActivityThread.main(ActivityThread.java:4627)
WARN/System.err(675): at java.lang.reflect.Method.invokeNative(Native Method)
WARN/System.err(675): at java.lang.reflect.Method.invoke(Method.java:521)
WARN/System.err(675): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
WARN/System.err(675): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
WARN/System.err(675): at dalvik.system.NativeStart.main(Native Method)
实际上,我无法理解在通知程序应用程序的清单文件中包含哪些权限来访问 k9Mail 的 MessageList。我粘贴在 k9mail 应用程序清单文件中包含的权限下方:
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS"/>
<uses-permission android:name="android.permission.READ_OWNER_DATA"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="org.thialfihar.android.apg.permission.READ_KEY_DETAILS"/>
<permission android:name="com.fsck.k9.permission.READ_ATTACHMENT"
android:permissionGroup="android.permission-group.MESSAGES"
android:protectionLevel="dangerous"
android:label="@string/read_attachment_label"
android:description="@string/read_attachment_desc"/>
<uses-permission android:name="com.fsck.k9.permission.READ_ATTACHMENT"/>
<permission android:name="com.fsck.k9.permission.REMOTE_CONTROL"
android:permissionGroup="android.permission-group.MESSAGES"
android:protectionLevel="dangerous"
android:label="@string/remote_control_label"
android:description="@string/remote_control_desc"/>
<uses-permission android:name="com.fsck.k9.permission.REMOTE_CONTROL"/>
<permission android:name="com.fsck.k9.permission.READ_MESSAGES"
android:permissionGroup="android.permission-group.MESSAGES"
android:protectionLevel="normal"
android:label="@string/read_messages_label"
android:description="@string/read_messages_desc"/>
<uses-permission android:name="com.fsck.k9.permission.READ_MESSAGES"/>
<permission android:name="com.fsck.k9.permission.DELETE_MESSAGES"
android:permissionGroup="android.permission-group.MESSAGES"
android:protectionLevel="normal"
android:label="@string/delete_messages_label"
android:description="@string/read_messages_desc"/>
<uses-permission android:name="com.fsck.k9.permission.DELETE_MESSAGES"/>
谁能告诉我在我的应用中包含哪些权限?在上面的权限中,有些权限只适用于 k9mail ,因为那些是为 k9 编写的权限类。所以,我只能在上面给定的权限中包含android的内置权限。我也尝试过这样做,但它并没有解决我的问题:(
【问题讨论】:
我通过在 AndroidManifest.xml 的 MessageList Activity 标签下的清单文件中添加以下意图过滤器解决了这个问题:我通过将 target sdk
版本从 19 开始的 kitkat 版本 AndroidManifest.xml.
更改来解决了这个异常
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
【讨论】:
顺便说一句,目前 Gradle 会处理这个问题,Android 开发人员不会在清单文件中指定 sdk 版本 有一个糟糕的解决方案。永远不要向下瞄准。 这会起作用,但很可能会导致比解决的问题更多的问题。这是我的看法【参考方案2】:我的问题是我有这个: 而不是这个:
【讨论】:
【参考方案3】:很简单,可能你的配置有错误。
例如:Manifest.xml
但在我的配置中有默认的 Activity .Splash
你需要检查这个配置和文件Manifest.xml
祝你好运
【讨论】:
【参考方案4】:您看到的java.lang.SecurityException
是因为您可能输入了两个指向同一活动的条目。删除第二个,你应该很高兴。
更多解释
您可以在清单中以不同的属性声明该活动 2 次,例如:
<activity android:name=".myclass"> </activity>
和
<activity android:name=".myclass" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
您应该从清单中删除不需要的项
【讨论】:
你可能会在清单中被声明 2 次具有不同属性的活动,例如: 和确保组件的“exported”标志设置为 true。 此外,定义权限的组件应该安装在使用它的组件之前。
【讨论】:
此外,您还必须确保您的应用程序位于 system/priv-app 分区中,才能享受系统级的奢华。这是 KitKat 后续设备所必需的【参考方案6】:在你的 Manifest 文件中写在</application >
之前
<activity android:name="com.fsck.k9.activity.MessageList">
<intent-filter>
<action android:name="android.intent.action.MAIN">
</action>
</intent-filter>
</activity>
告诉我它是否能解决你的问题:)
【讨论】:
通过查看日志我很确定它会有所帮助。做一件事在这里粘贴你的完整清单文件您必须在您尝试启动的活动的清单文件中添加android:exported="true"
。
来自android:exported documentation:
安卓:导出 Activity 是否可以由其他应用程序的组件启动 - 如果可以,则为“true”,否则为“false”。如果为“false”,则该活动只能由同一应用程序的组件或具有相同用户 ID 的应用程序启动。
默认值取决于活动是否包含意图过滤器。没有任何过滤器意味着该活动只能通过指定其确切的类名来调用。这意味着该活动仅用于应用程序内部使用(因为其他人不知道类名)。所以在这种情况下,默认值为“false”。另一方面,存在至少一个过滤器意味着该活动是供外部使用的,因此默认值为“true”。
此属性不是限制活动暴露给其他应用程序的唯一方法。您还可以使用权限来限制可以调用活动的外部实体(请参阅权限属性)。
【讨论】:
帮我解决了一半的问题,如果你尝试先用导出的服务安装应用程序,然后安装主应用程序,你将永远无法成功达到删除服务......另一种方式有效不过很好...这是因为安装主应用程序时没有所需的权限,但我不知道如何在不删除权限的情况下解决它...【参考方案8】:我在这个确切的活动中遇到了这个问题。
您不能从外部活动启动 com.fsck.k9.activity.MessageList。
我解决了:
Intent LaunchK9 = getPackageManager().getLaunchIntentForPackage("com.fsck.k9");
this.startActivity(LaunchK9);
使用http://developer.android.com/reference/android/content/pm/PackageManager.html
【讨论】:
所有其他答案都是关于应如何声明接收应用程序活动,但这个答案与如何调用隐式意图有关。谢谢!【参考方案9】:我遇到了同样的问题,并希望避免按照您的描述添加意图过滤器。经过一番挖掘,我发现了一个 xml 属性 android:exported,您应该将其添加到您想要调用的活动中。
如果您的活动没有添加意图过滤器,则默认设置为 false,但如果您有意图过滤器,则默认设置为 true。
这里是文档 http://developer.android.com/guide/topics/manifest/activity-element.html#exported
tl;dr:将android:exported="true"
添加到您的 AndroidManifest.xml 文件中的活动中,并避免添加意图过滤器 :)
【讨论】:
以上是关于Android:java.lang.SecurityException:权限拒绝:启动意图的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )