【问题标题】:Android: java.lang.SecurityException: Permission Denial: start IntentAndroid:java.lang.SecurityException:权限拒绝:启动意图
【发布时间】: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 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的内置权限。我也尝试过这样做,但它并没有解决我的问题:(

【问题讨论】:

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

标签: android permissions securityexception


【解决方案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 文件中的活动中,并避免添加意图过滤器 :)

      【讨论】:

        猜你喜欢
        • 2013-11-18
        • 1970-01-01
        • 2013-06-05
        • 2021-03-13
        • 1970-01-01
        • 2021-02-20
        相关资源
        最近更新 更多