Android:java.lang.SecurityException:权限拒绝:启动意图

我创build了一个应用程序,其中包含从其他应用程序调用的GWVectraNotifier活动,以显示通知。

在通知对话框中,将出现“显示”button和“closures”button。

点击“显示”button,相应的活动将开始。

要检查上述应用程序的function,

我从K9Mail应用程序启动了checkmail事件触发器的GWVectraNotifier活动。

我能够成功启动GWVectraNotifier活动,但是点击“显示”button,我将不得不启动K9mail的“MessageList”活动。为此,我写了下面的代码:

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 ProcessRecord{43f6d7c8 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 ProcessRecord{43f6d7c8 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的内置权限。 我也这样做,但它并没有解决我的问题:(

您必须在您尝试启动的活动的清单文件中添加android:exported="true"

从android:输出文档 :

机器人:出口
是否可以由其他应用程序的组件启动活动 – 如果可以,则为“true”,否则为“false”。 如果为“false”,则只能由具有相同用户ID的相同应用程序或应用程序的组件启动活动。

默认值取决于活动是否包含意图filter。 没有任何filter意味着活动只能通过指定其确切的类名来调用。 这意味着该活动仅用于应用程序内部使用(因为其他人不知道类名)。 所以在这种情况下,默认值是“false”。 另一方面,至less存在一个filter意味着该活动是为了外部使用,所以默认值是“true”。

此属性不是限制活动暴露于其他应用程序的唯一方法。 您还可以使用权限来限制可以调用该活动的外部实体(请参阅权限属性)。

您看到的java.lang.SecurityException是因为您可能input两个指向同一活动的条目。 删除第二个,你应该很好去。

更多解释

您可能会在不同属性的清单中宣布这个活动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> 

您应该从清单中删除不需要的

在你的Manifest文件中写</application >之前

 <activity android:name="com.fsck.k9.activity.MessageList"> <intent-filter> <action android:name="android.intent.action.MAIN"> </action> </intent-filter> </activity> 

并告诉我,如果它解决了你的问题:)

我有这个确切的活动的问题。

您无法从外部活动启动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

我遇到了同样的问题,并希望避免像您所描述的那样添加意图filter。 经过一番挖掘,我发现了一个xml属性android:exports ,你应该添加到你想要调用的activity。

如果没有意图filter添加到您的活动,则默认设置为false,但是如果您有意向filter,则将其设置为true。

这里是文档http://developer.android.com/guide/topics/manifest/activity-element.html#exported

tl; dr:将android:exported="true"到您的AndroidManifest.xml文件中的活动,并避免添加intent-filter 🙂

确保组件的“导出”标志设置为true。 此外,定义权限的组件应安装在使用它的组件之前。

我通过从19开始kitkat版本AndroidManifest.xml.更改target sdk版本解决了这个exceptionAndroidManifest.xml.

 <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="19" /> 

很容易,也许你在configuration上有错误。

例如:Manifest.xml

在这里输入图像描述

但在我的configuration有默认的Activity .Splash

在这里输入图像描述

你需要检查这个configuration和Manifest.xml文件

祝你好运

我的问题是,我有这个: 错误 而不是这个: 正确