Android:java.lang.SecurityException:Permission Denial:启动Intent

Swa*_* EP 111 permissions android securityexception denied

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

在"通知"对话框中,将显示"显示"按钮和"关闭"按钮.

单击"显示"按钮,将启动相应的活动.

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

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

我能够成功启动GWVectraNotifier活动,但是点击'show'按钮我将不得不启动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); 
Run Code Online (Sandbox Code Playgroud)

抛出:

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)
Run Code Online (Sandbox Code Playgroud)

实际上我无法理解在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"/>           
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我哪些权限包含在我的应用程序中?在上面的权限中,有些仅适用于k9mail,因为这些是为k9编写的权限类.所以,我只能在上面给出的权限中包含android的内置权限.我试过这样做,但它没有解决我的问题:(

小智 155

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

android:export文档:

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

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

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

  • 解决了我的一半问题,如果你先尝试用导出的服务安装应用程序,然后安装主应用程序,你就永远无法成功去除服务......其他方式工作正常但是...这是因为安装主应用程序时不存在所需的权限,但我不知道如何在不删除权限的情况下解决它... (2认同)

Jom*_*mia 101

java.lang.SecurityException你看到的是,因为您可以输入指向同一活动的两个项目.删除第二个,你应该很高兴去.

更多解释

您可以在清单中将活动声明为具有不同属性的活动2次,例如:

 <activity android:name=".myclass"> </activity>
Run Code Online (Sandbox Code Playgroud)

 <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>
Run Code Online (Sandbox Code Playgroud)

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

  • 你可以在清单中用不同的属性声明活动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认同)

Muh*_*hab 16

在你的Manifest文件中写这个 </application >

<activity android:name="com.fsck.k9.activity.MessageList">
   <intent-filter>
      <action android:name="android.intent.action.MAIN">
      </action>
   </intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)

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


小智 7

这个确切的活动我遇到了这个问题.

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


小智 6

我遇到了同样的问题,并希望避免添加你所描述的intent过滤器.经过一番挖掘,我找到了一个xml属性android:export,你应该添加到你想要调用的活动中.

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

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

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