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


112

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

在“通知”对话框中,将有“显示”按钮和“关闭”按钮。

单击“显示”按钮,将启动相应的活动。

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

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

我能够成功启动GWVectraNotifier活动,但是单击“显示”按钮时,我将必须启动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)

实际上,我无法理解在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编写的权限类。因此,我将只能在上述给定权限中包括android的内置权限。我也尝试过这样做,但是并不能解决我的问题:(


我通过在清单文件中在AndroidManifest.xml的MessageList Activity标签下添加以下意图过滤器来解决此问题:<intent-filter> <action android:name =“ android.intent.action.MAIN” /> </ intent-filter >
Swathi EP

我同时添加了<intent-filter> <action android:name =“ android.intent.action.MAIN” /> </ intent-filter>和android:exported =“ true”,但我仍在获取java.lang.security例外?您能帮我解决这个问题吗?
Charan Pai

Answers:


155

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

android:exported文档

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

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

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


2
对我来说,解决了一半的问题,如果您尝试先使用导出的服务安装应用程序,然后再安装主应用程序,那么您将永远无法成功删除服务...否则,其他方法都可以正常工作...这是因为安装主应用程序时不存在所需的权限,但是我不知道如何在不删除权限的情况下解决该问题...
Bibu 2014年

102

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

更多说明

您可以使用不同的属性在清单中将活动声明两次,例如:

 <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
您可能会在清单中用不同的属性将活动声明为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>。您应该从清单中删除不需要的
Jomia 2011年

1
好的答案jomia。但是一个问题,一次我只有一个启动器活动。相同的代码在eumlaotr上运行,但在设备中显示安全异常。请您详细说明。
Tofeeq Ahmad 2011年

我认为您必须在设备中卸载该应用,然后再次重新安装。然后它将起作用
Jomia

16

在清单文件中,先写 </application >

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

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


通过查看日志,我非常确定这会有所帮助。做一件事将您的完整清单文件粘贴到此处
Muhammad Shahab 2010年

<manifest xmlns:android =“ schemas.android.com/apk/res/android ” package =“ com.i10n.notifier” android:versionCode =“ 1” android:versionName =“ 1.0”> <uses-permission android:name =“ android.permission.RECEIVE_BOOT_COMPLETED” /> <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” />
Swathi EP 2010年

<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” /> <application android:icon =“ @ drawable / icon” android:label =“ @ string / app_name” android:theme =“ @ android:style / Theme.NoTitleBar“> <activity android:name =”。GWVectraNotifier“ android:label =” @ string / app_name“ android:theme =” @ android:style / Theme.Dialog“>
Swathi EP 2010年

<intent-filter> <action android:name =“ android.intent.action.MAIN” /> <category android:name =“ android.intent.category.LAUNCHER” /> </ intent-filter> </ activity> < / application> </ manifest>
Swathi EP

在以上3条评论中,我粘贴了Notifier应用程序清单文件。感谢您的回复。
Swathi EP


6

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

如果没有将意图过滤器添加到活动中,则默认情况下将其设置为false,但是如果您确实有一个意图过滤器,则将其设置为true。

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

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


1

确保组件的“已导出”标志设置为true。同样,定义许可的组件也应安装在使用许可的组件之前。


另外,您还必须确保在系统/私有应用程序分区中拥有应用程序,才能享受系统级的豪华体验。这是KitKat后续设备中必需的
Naren 2014年

1

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

例如:Manifest.xml

在此处输入图片说明

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

在此处输入图片说明

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

祝好运


1

我通过将target sdk版本从19开始的kitkat版本进行了更改解决了该异常AndroidManifest.xml.

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

顺便说一句,目前Gradle会处理此问题,Android开发人员未在清单文件中指定sdk版本
kiedysktos,2015年

1
有一个可怕的解决方案。永远不要向下瞄准。
Jared Burrows 2015年

这将起作用,但是很有可能导致比解决的问题更多的问题。那就是我的观点
Evren Ozturk'May

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.