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

Posted

技术标签:

【中文标题】Android:java.lang.SecurityException:权限拒绝:启动意图【英文标题】:Android: java.lang.SecurityException: Permission Denial: start Intent 【发布时间】:2011-05-08 22:14:48 【问题描述】:

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

【问题讨论】:

我通过在 AndroidManifest.xml 的 MessageList Activity 标签下的清单文件中添加以下意图过滤器解决了这个问题: 我已经添加了 和 android:exported="true" 但仍然我得到 java.lang.security 异常?你能帮我解决这个问题吗.. 【参考方案1】:

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

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

【讨论】:

顺便说一句,目前 Gradle 会处理这个问题,Android 开发人员不会在清单文件中指定 sdk 版本 有一个糟糕的解决方案。永远不要向下瞄准。 这会起作用,但很可能会导致比解决的问题更多的问题。这是我的看法【参考方案2】:

我的问题是我有这个: 而不是这个:

【讨论】:

【参考方案3】:

很简单,可能你的配置有错误。

例如:Manifest.xml

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

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

祝你好运

【讨论】:

【参考方案4】:

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

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

【讨论】:

你可能会在清单中被声明 2 次具有不同属性的活动,例如: 和 。您应该从清单中删除不需要的 jomia 的好答案。但是一个问题,一次我只有一个启动器活动。同样的代码使用 eumlaotr 运行,但在设备中显示安全异常。请详细说明。 我认为您必须卸载设备中的应用程序并重新安装。然后它会工作【参考方案5】:

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

【讨论】:

此外,您还必须确保您的应用程序位于 system/priv-app 分区中,才能享受系统级的奢华。这是 KitKat 后续设备所必需的【参考方案6】:

在你的 Manifest 文件中写在&lt;/application &gt;之前

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

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

【讨论】:

通过查看日志我很确定它会有所帮助。做一件事在这里粘贴你的完整清单文件 schemas.android.com/apk/res/android" package="com.i10n.notifier" android:versionCode="1" android:versionName="1.0"> 跨度> -filter> 在上述 3 个 cmets 中,我粘贴了我的 Notifier 应用程序清单文件。感谢您的回复。【参考方案7】:

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

来自android:exported documentation:

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

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

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

【讨论】:

帮我解决了一半的问题,如果你尝试先用导出的服务安装应用程序,然后安装主应用程序,你将永远无法成功达到删除服务......另一种方式有效不过很好...这是因为安装主应用程序时没有所需的权限,但我不知道如何在不删除权限的情况下解决它...【参考方案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

【讨论】:

所有其他答案都是关于应如何声明接收应用程序活动,但这个答案与如何调用隐式意图有关。谢谢!【参考方案9】:

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

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

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

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

【讨论】:

以上是关于Android:java.lang.SecurityException:权限拒绝:启动意图的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )

android 21 是啥版本

Android逆向-Android基础逆向(2-2)

【Android笔记】android Toast

图解Android - Android核心机制

Android游戏开发大全的目录