例外: 权限拒绝: 启动意图

我已经创建了一个包含 GWVectraNotifier 活动的应用程序,其他应用程序调用该活动来显示 Notification。

在通知对话框中,会出现“显示”按钮和“关闭”按钮。

点击“显示”按钮,相应的活动就会开始。

要检查上述应用程序的功能,

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

I am able to start the GWVectraNotifier activity successfully, but onclick of 'show' button i will have to start 'MessageList' activity of K9mail.To do so, i wrote the below code:

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)

实际上,我不能理解在 Notifier 应用程序的清单文件中包含哪些权限来访问 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编写的权限类。因此,我将只能包括在上述给定的权限内置的安卓权限。我也尝试过这样做,但这并没有解决我的问题:

194665 次浏览

在清单文件中,在 </application >之前写入此内容

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

The java.lang.SecurityException you are seeing is because you may enter two entries pointing to the same activity. Remove the second one and you should be good to go.

More Explanation

您可以在清单中使用不同的属性声明该活动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>

You should remove the unwanted one from the manifest

我遇到了同样的问题,希望避免像您描述的那样添加意图过滤器。经过深入研究,我发现了一个 xml 属性 出口,您应该将它添加到希望被调用的活动中。

It is by default set to false if no intent filter added to your activity, but if you do have an intent filter it gets set to true.

这是文件 Http://developer.android.com/guide/topics/manifest/activity-element.html#exported

tl;dr: addandroid:exported="true" to your activity in your AndroidManifest.xml file and avoid adding the intent-filter :)

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

From the Android: 导出的文档:

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

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

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

我对这个活动有点疑问。

不能从外部活动启动 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

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

我通过将 target sdk版本从19开始的 kitkat 版本 AndroidManifest.xml.改变来解决这个异常

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

这很容易,也许你有错误的配置。

例如: Manifest.xml

enter image description here

But in my configuration have for default Activity .Splash

enter image description here

you need 检查完毕 this configuration and the file Manifest.xml

祝你好运

我的问题是,我有这个: wrong Instead of this: correct