Android - java.lang.SecurityException: 权限拒绝:启动Intent

118

我在项目的构建路径上有一个库(jar)文件。该项目通过以下意图访问该库中的MainActivity:

final Intent it = new Intent();
it.setClassName("com.example.lib", "com.example.lib.MainActivity");
startActivity(it);

它曾经能够工作一段时间,但突然出现了“ActivityNotFoundException:没有找到处理Intent的活动”,我解决了这个问题。但现在我卡在了“java.lang.SecurityException:Permission Denial:starting Intent”上。

我尝试了stackoverflow上提出的所有建议(检查清单文件中的重复项;将android:exported =“true”添加到库清单中;Eclipse>项目>清理;添加/修改“intent-filter”标记等),甚至尝试重写项目的清单,但没有任何进展。

以下是logcat输出:

11-07 06:20:52.176: E/AndroidRuntime(4626): FATAL EXCEPTION: main
11-07 06:20:52.176: E/AndroidRuntime(4626): java.lang.SecurityException: Permission     Denial: starting Intent { cmp=com.example.lib/.MainActivity } from ProcessRecord{40dd3778     4626:com.example.project/u0a10046} (pid=4626, uid=10046) not exported from uid 10047
11-07 06:20:52.176: E/AndroidRuntime(4626):     at android.os.Parcel.readException(Parcel.java:1425)
11-07 06:20:52.176: E/AndroidRuntime(4626):     at android.os.Parcel.readException(Parcel.java:1379)
11-07 06:20:52.176: E/AndroidRuntime(4626):     at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1885)
11-07 06:20:52.176: E/AndroidRuntime(4626):     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1412)
11-07 06:20:52.176: E/AndroidRuntime(4626):     at android.app.Activity.startActivityForResult(Activity.java:3370)
11-07 06:20:52.176: E/AndroidRuntime(4626):     at android.app.Activity.startActivityForResult(Activity.java:3331)
11-07 06:20:52.176: E/AndroidRuntime(4626):     at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:824)
11-07 06:20:52.176: E/AndroidRuntime(4626):     at android.app.Activity.startActivity(Activity.java:3566)
11-07 06:20:52.176: E/AndroidRuntime(4626):     at android.app.Activity.startActivity(Activity.java:3534)
11-07 06:20:52.176: E/AndroidRuntime(4626):     at com.example.project.MainActivity.onOptionsItemSelected(MainActivity.java:93)
11-07 06:20:52.176: E/AndroidRuntime(4626):     at android.app.Activity.onMenuItemSelected(Activity.java:2548)
11-07 06:20:52.176: E/AndroidRuntime(4626):     at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:366)
11-07 06:20:52.176: E/AndroidRuntime(4626):     at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:980)
11-07 06:20:52.176: E/AndroidRuntime(4626):     at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735)
11-07 06:20:52.176: E/AndroidRuntime(4626):     at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:149)
11-07 06:20:52.176: E/AndroidRuntime(4626):     at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874)
11-07 06:20:52.176: E/AndroidRuntime(4626):     at com.android.internal.view.menu.ActionMenuView.invokeItem(ActionMenuView.java:547)
11-07 06:20:52.176: E/AndroidRuntime(4626):     at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:115)
11-07 06:20:52.176: E/AndroidRuntime(4626):     at android.view.View.performClick(View.java:4204)
11-07 06:20:52.176: E/AndroidRuntime(4626):     at android.view.View$PerformClick.run(View.java:17355)
11-07 06:20:52.176: E/AndroidRuntime(4626):     at android.os.Handler.handleCallback(Handler.java:725)
11-07 06:20:52.176: E/AndroidRuntime(4626):     at android.os.Handler.dispatchMessage(Handler.java:92)
11-07 06:20:52.176: E/AndroidRuntime(4626):     at android.os.Looper.loop(Looper.java:137)
11-07 06:20:52.176: E/AndroidRuntime(4626):     at android.app.ActivityThread.main(ActivityThread.java:5041)
11-07 06:20:52.176: E/AndroidRuntime(4626):     at java.lang.reflect.Method.invokeNative(Native Method)
11-07 06:20:52.176: E/AndroidRuntime(4626):     at java.lang.reflect.Method.invoke(Method.java:511)
11-07 06:20:52.176: E/AndroidRuntime(4626):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
11-07 06:20:52.176: E/AndroidRuntime(4626):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
11-07 06:20:52.176: E/AndroidRuntime(4626):     at dalvik.system.NativeStart.main(Native Method)

项目的清单XML:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.project"
android:versionCode="4"
android:versionName="4.0" >

<!-- Permissions -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<supports-screens android:anyDensity="true" />

<!-- SDK Settings -->
<uses-sdk
    android:minSdkVersion="11"
    android:targetSdkVersion="18" />

<!-- APP Start -->
<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

<!-- App Activity -->
    <activity
        android:name="com.example.project.MainActivity"
        android:label="@string/app_name"
        android:screenOrientation="portrait" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

<!-- Library Activity -->
    <activity android:name="com.example.lib.MainActivity" android:label="LibMain">
         <intent-filter>
        <action android:name="android.intent.action.MAIN"></action>
     </intent-filter>
    </activity>

</application>
<!-- END - APP -->

</manifest>

我忽略了什么?有什么建议吗?

编辑

我已经更新了manifest.xml,包括所有其他活动,并且以某种方式解决了问题。意图活动启动时没有任何错误。但是,这只在AVD上有效。在实际设备上仍会出现相同的错误。我已经完全卸载并重新安装了设备上的应用程序,但仍然出现相同的错误。


还尝试过:项目> Java Build Path> Order and Export> 在jar文件上打勾> 项目清理 - 打开意图时仍出现相同的错误。 - Ramanathan
这里可以帮助:https://dev59.com/tm855IYBdhLWcg3wvnOE#8784878 - CoDe
14个回答

247

在声明该Activity时,您需要在AndroidManifest.xml文件中设置android:exported="true"

<activity
    android:name="com.example.lib.MainActivity"
    android:label="LibMain" 
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" >
        </action>
    </intent-filter>
</activity>

4
尝试过了。我在项目的manifest.xml文件中的<activity android:name="com.example.lib.MainActivity">下添加了android:exported="true"。但是仍然出现相同的错误。 - Ramanathan
移除“intent-filter”后再试一次。 - Sunny
2
清单文件中的活动现在看起来像这样:<activity "com.example.lib.MainActivity" android:label="LibMain" android:exported="true"> </activity> 仍然是相同的错误。 - Ramanathan
it.setComponent(new ComponentName("com.example.lib", "com.example.lib.MainActivity")); -- 相同的错误。 - Ramanathan
1
在使用Appium执行时,我们如何避免这种情况发生? - Ashok kumar Ganesan
显示剩余8条评论

43

仅适用于Android Studio

我最近遇到了这个问题。问题出在构建/运行配置上。显然,Android Studio选择了我的项目中的一个活动作为启动活动,从而忽略了我在清单文件中的选择。

单击运行按钮左侧的模块名称,然后单击“编辑配置...”现在确保选择了“启动默认活动”。

当我遇到这个错误时,有趣的是,我仍然可以从设备启动应用并且它会使用首选活动开始。但是从IDE启动似乎是不可能的。


2
谢谢兄弟...它起作用了...有时候小问题会变成大问题...但我学到了一个叫做android:export = true的东西...谢谢。 - Anchal
5
啊,我也遇到过这种情况(猫一直躺在键盘上睡觉)。花了很长时间才找出问题所在,不过找到那只猫还是很容易的。 - Stefan H Singer

27

选择适当的配置来启动应用程序。

在我的情况下,我发现错误如下图所示:

输入图像描述

我刚刚像这样进行了更改:

输入图像描述

也许对某些人有帮助,谢谢 :)


9
请在 'com.example.lib.MainActivity' 的 activity 标签中添加 android:exported="true"。
根据 android:exported 的官方说明,该属性用于指定该 activity 是否可以被其他应用程序的组件启动。如果值为“true”,则可以被启动;否则,只能由相同应用程序或具有相同用户 ID 的应用程序的组件启动。
从您的 logcat 输出中可以看出,UID 不匹配导致了问题。因此,添加 android:exported="true" 应该可以解决这个问题。

4

我在一个React Native项目中遇到了这个问题,在添加启动屏幕活动并将其设为启动器活动后出现了这个问题。

这是我在MainActivity配置中对Android清单XML文件进行的更改。

<activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
        android:windowSoftInputMode="adjustResize"/>
      <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />

我添加了android:exported=true,活动配置如下。

 <activity
        android:name=".MainActivity"
        android:exported="true"
        android:label="@string/app_name"
        android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
        android:windowSoftInputMode="adjustResize"/>
      <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
   


2

android:exported="true" 这行代码添加到你的第一个启动活动中

<?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        package="org.triad.hp">
    
        <uses-permission
            android:name="android.permission.WRITE_EXTERNAL_STORAGE"
            android:required="false"   tools:node="remove" />
        <uses-permission
            android:name="android.permission.READ_EXTERNAL_STORAGE"
            android:required="false" tools:node="remove" />
        <uses-permission
            android:name="android.permission.READ_SMS"
            android:required="false" tools:node="remove" />
        <uses-permission
            android:name="android.permission.RECEIVE_SMS"
            android:required="false" tools:node="remove" />
    
        <uses-permission android:name="android.permission.INTERNET"/>
    
        <uses-permission android:name="com.hp.kiosk.data.PERMISSION"/>
    
        <application
            android:hardwareAccelerated="true"
            android:usesCleartextTraffic="false"
            android:name=".App"
            android:configChanges="keyboard|keyboardHidden|screenSize|orientation"
            android:icon="@drawable/logo"
            android:allowBackup="false"
            android:label="@string/app_name"
            android:roundIcon="@drawable/logo"
            android:debuggable="false"
            android:theme="@style/AppTheme"
            tools:ignore="HardcodedDebugMode">
            <activity
                android:protectionLevel="signature"
                android:screenOrientation="landscape"
                android:configChanges="keyboard|keyboardHidden|screenSize|orientation"
                android:name=".activities.PaymentActivity"
                tools:ignore="LockedOrientationActivity"
                android:exported="true">
                <intent-filter>
                    <action android:name="org.triad.hp.activities.PaymentActivity" />
                     <category android:name="android.intent.category.DEFAULT" />
                </intent-filter>
            </activity>
    
            <activity
                android:screenOrientation="landscape"
                android:configChanges="keyboard|keyboardHidden|screenSize|orientation"
                android:name=".activities.MainActivity"
                tools:ignore="LockedOrientationActivity"
                android:exported="true">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                     <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
            <activity
                android:exported="false"
                tools:replace="android:screenOrientation"
                android:screenOrientation="landscape"
                 android:configChanges="keyboard|keyboardHidden|screenSize|orientation"
                 android:name="com.paytm.pgsdk.PaytmPGActivity"
                tools:ignore="HardcodedDebugMode,LockedOrientationActivity" />
        </application>
    
    </manifest>

2

与Olayinka关于ADT配置文件的答案类似:我在IntelliJ的IdeaU v14上遇到了同样的问题。

我正在按照教程进行操作,将起始活动从MyActivity更改为MyListActivity(这是MyActivity列表)。然后我开始收到权限拒绝的错误。

经过多次尝试和努力,在.idea\workspace.xml文件中:

...
<configuration default="false" name="MyApp" type="AndroidRunConfigurationType" factoryName="Android Application">
    <module name="MyApp" />
    <option name="ACTIVITY_CLASS" value="com.domain.MyApp.MyActivity" />
    ...
</configuration>
...

我将MyActivity更改为MyListActivity,重新加载了项目,现在我又开始滚动起来了。

不确定您使用的是哪个IDE,但也许您的IDE正在覆盖或强制执行特定的启动活动?


1
如果您想通过安卓手机测试在Android Studio编写的应用程序,通常是手机的问题。只需取消所有USB调试选项并将开发人员选项切换为关闭状态。然后重新启动手机并打开开发人员和USB调试。您就可以开始了!

1
在你尝试打开一个网页时,如果出现权限拒绝错误并导致崩溃的情况下,你需要通过添加使意图可浏览来解决。
intent.addCategory(Intent.CATEGORY_BROWSABLE)

0
如果我们将特定的activity设为
android:exported="true"

这将是启动活动。 单击运行按钮左侧的模块名称,然后单击“编辑配置...”现在确保选择了"启动默认活动"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接