114

我创建了一个包含 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 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的内置权限。我也尝试过这样做,但它并没有解决我的问题:(

4

9 回答 9

157

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

android:exported 文档

android:exported
Activity 是否可以由其他应用程序的组件启动 - 如果可以,则为“true”,否则为“false”。如果为“false”,则该活动只能由同一应用程序的组件或具有相同用户 ID 的应用程序启动。

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

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

于 2012-01-09T06:57:47.073 回答
102

您看到的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>

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

于 2011-05-16T09:24:03.380 回答
16

在你的清单文件之前写这个</application >

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

并告诉我它是否解决了您的问题:)

于 2010-11-12T08:11:00.977 回答
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

于 2012-05-08T01:41:51.423 回答
6

我遇到了同样的问题,并希望避免按照您的描述添加意图过滤器。经过一番挖掘,我发现了一个 xml 属性android:exported,您应该将其添加到您想要调用的活动中。

如果您的活动没有添加意图过滤器,则默认设置为 false,但如果您确实有意图过滤器,则将其设置为 true。

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

tl;dr:android:exported="true"在您的 AndroidManifest.xml 文件中添加到您的活动,并避免添加意图过滤器:)

于 2011-11-04T21:37:02.947 回答
1

I solved this exception by changing the target sdk version from 19 onwards kitkat version AndroidManifest.xml.

<uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />
于 2014-10-21T06:34:23.100 回答
1

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

于 2014-07-24T20:47:51.987 回答
1

很容易,也许您在配置中有错误。

例如:Manifest.xml

在此处输入图像描述

但在我的配置中有默认的 Activity .Splash

在此处输入图像描述

您需要检查此配置和文件 Manifest.xml

祝你好运

于 2016-03-18T16:56:22.760 回答
0

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

于 2016-04-12T07:16:05.190 回答