Android : java.lang.SecurityException : 권한 거부 : 의도 시작 응용 프로그램을

알림을 표시하기 위해 다른 응용 프로그램에서 호출되는 GWVectraNotifier 활동이 포함 된 응용 프로그램을 만들었습니다.

알림 대화 상자에는 ‘표시’버튼과 ‘닫기’버튼이 있습니다.

‘표시’버튼을 클릭하면 해당 활동이 시작됩니다.

위 애플리케이션의 기능을 확인하려면

checkmail 이벤트 트리거에서 K9Mail 응용 프로그램에서 GWVectraNotifier 활동을 시작했습니다.

GWVectraNotifier 활동을 성공적으로 시작할 수 있지만 ‘show’버튼을 클릭하면 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)

실제로 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의 기본 제공 권한 만 포함 할 수 있습니다. 나도 그렇게 시도했지만 내 문제가 해결되지 않았습니다.



답변

android:exported="true"시작하려는 활동에 매니페스트 파일 을 추가 해야합니다.

로부터 수출 문서 : 안드로이드 :

android : exported
다른 응용 프로그램의 구성 요소에서 활동을 시작할 수 있는지 여부 — 가능하면 “true”, 그렇지 않으면 “false”입니다. “false”인 경우 활동은 동일한 애플리케이션의 구성 요소 또는 동일한 사용자 ID를 가진 애플리케이션에 의해서만 실행될 수 있습니다.

기본값은 활동에 인 텐트 필터가 포함되어 있는지 여부에 따라 다릅니다. 필터가 없다는 것은 정확한 클래스 이름을 지정해야만 활동을 호출 할 수 있음을 의미합니다. 이것은 활동이 애플리케이션 내부 용으로 만 사용된다는 것을 의미합니다 (다른 사람들이 클래스 이름을 알지 못하기 때문에). 따라서이 경우 기본값은 “false”입니다. 반면에 필터가 하나 이상 있다는 것은 활동이 외부 사용을위한 것임을 의미하므로 기본값은 “true”입니다.

이 속성은 다른 애플리케이션에 대한 활동의 ​​노출을 제한하는 유일한 방법은 아닙니다. 권한을 사용하여 활동을 호출 할 수있는 외부 엔터티를 제한 할 수도 있습니다 (권한 속성 참조).


답변

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>

매니페스트에서 원치 않는 항목을 제거해야합니다.


답변

매니페스트 파일에서 이것을 작성하십시오. </application >

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

문제가 해결되는지 알려주세요 🙂


답변

이 정확한 활동에이 문제가있었습니다.

외부 활동에서 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 사용


답변

동일한 문제가 발생했으며 설명한대로 인 텐트 필터를 추가하지 않으려 고했습니다. 몇 가지 파헤친 후, 호출하려는 활동에 추가해야하는 xml 속성 android : exported 를 발견했습니다 .

활동에 인 텐트 필터가 추가되지 않은 경우 기본적으로 false로 설정되지만 인 텐트 필터가있는 경우 true로 설정됩니다.

다음은 http://developer.android.com/guide/topics/manifest/activity-element.html#exported 문서입니다.

tl; dr : android:exported="true"AndroidManifest.xml 파일의 활동에 추가하고 인 텐트 필터를 추가하지 마십시오. 🙂


답변

구성 요소에 “내 보낸”플래그가 true로 설정되어 있는지 확인하십시오. 또한 권한을 정의하는 구성 요소를 사용하는 구성 요소보다 먼저 설치해야합니다.


답변

구성에 오류가있을 수 있습니다.

예 : Manifest.xml

하지만 내 구성에는 기본 Activity .Splash가 있습니다.

이 구성과 Manifest.xml 파일을 확인 해야 합니다.

행운을 빕니다