当 运行 android 应用程序在 phone 时发生 SecurityException

SecurityException when running android app on phone

我第一次在外部 phone 上测试我的应用程序...它在模拟器上完美运行。我的外部设备是三星 Galaxy S6 Edge。

我无法开始找出错误所在,因为当我 运行 它处于调试模式并在启动 activity 的 onCreate() 的第一行放置断点时,它在它到达那里之前抛出错误。

虽然有解决方案会很好,但我真的很想知道我需要采取哪些步骤来找到问题的根本原因并解决问题。

谢谢

Launching application: com.projects.fbgrecojr.vamoose/com.projects.fbgrecojr.vamoose.LoginActivity.
    DEVICE SHELL COMMAND: am start  -n "com.projects.fbgrecojr.vamoose/com.projects.fbgrecojr.vamoose.LoginActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
    Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.projects.fbgrecojr.vamoose/.LoginActivity }
    java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.projects.fbgrecojr.vamoose/.LoginActivity } from null (pid=31173, uid=2000) not exported from uid 10224
    at android.os.Parcel.readException(Parcel.java:1540)
    at android.os.Parcel.readException(Parcel.java:1493)
    at android.app.ActivityManagerProxy.startActivityAsUser(ActivityManagerNative.java:2586)
    at com.android.commands.am.Am.runStart(Am.java:768)
    at com.android.commands.am.Am.onRun(Am.java:307)
    at com.android.internal.os.BaseCommand.run(BaseCommand.java:47)
    at com.android.commands.am.Am.main(Am.java:102)
    at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
    at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:255)

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.projects.fbgrecojr.vamoose" >

    <!-- To auto-complete the email text field in the login form with the user's emails -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".LoginActivity"
            android:label="@string/title_activity_main" >
        </activity>
        <activity
            android:name=".UserActivity"
            android:label="@string/title_activity_user" >
        </activity>
        <activity
            android:name=".AdminActivity"
            android:label="@string/title_activity_admin" >
        </activity>
        <activity
            android:name=".AdminSettings"
            android:label="@string/title_activity_admin_settings" >
        </activity>
        <activity
            android:name=".ContactsActivity"
            android:label="@string/title_activity_contacts" >
        </activity>
        <activity
            android:name=".AddUser"
            android:label="@string/title_activity_specific_contact" >
        </activity>
        <activity
            android:name=".User"
            android:label="@string/title_activity_user" >
        </activity>
        <activity
            android:name=".HistoryActivity"
            android:label="@string/title_activity_history" >
        </activity>
        <activity
            android:name=".CalendarActivity"
            android:label="@string/title_activity_calendar" >
        </activity>
        <activity
            android:name=".AboutActivity"
            android:label="@string/title_activity_about" >
        </activity>
    </application>

</manifest>

在您的清单中,您应该使用 intent-filter:

指定应该在启动时启动的 activity
<activity
  android:name=".LoginActivity"
  android:label="@string/title_activity_main" >
    <intent-filter>
      <action android:name="android.intent.action.MAIN" />
      <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

这里的问题是,如果没有 intent-filter,默认情况下不会导出活动 (docs on android:exported),并且只能由相同应用程序的组件或具有相同用户 ID 的应用程序启动。