Android : java.lang.SecurityException : 권한 거부 : 의도 시작


112

알림을 표시하기 위해 다른 응용 프로그램에서 호출되는 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의 기본 제공 권한 만 포함 할 수 있습니다. 나도 그렇게 시도했지만 내 문제가 해결되지 않았습니다.


AndroidManifest.xml의 MessageList Activity 태그 아래 매니페스트 파일에 다음 인 텐트 필터를 추가하여이 문제를 해결했습니다. <intent-filter> <action android : name = "android.intent.action.MAIN"/> </ intent-filter >
Swathi EP

<intent-filter> <action android : name = "android.intent.action.MAIN"/> </ intent-filter> 및 android : exported = "true"를 모두 추가했지만 여전히 java.lang.security를 ​​받고 있습니다. 예외? 도움을 기쁘게 할 날이 .. 해결하기 위해
Charan 파이

답변:


155

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

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

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

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

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


2
나에게 문제의 절반을 수정하십시오. 먼저 내 보낸 서비스로 응용 프로그램을 설치 한 다음 주 응용 프로그램을 설치하면 서비스 제거에 성공하지 못할 것입니다 ... 그럼에도 불구하고 다른 방법은 정상적으로 작동하기 때문입니다. ... 필요한 권한은 주요 응용 프로그램을 설치할 때 존재하지 않는,하지만 난 권한을 제거하지 않고 그것을 해결하는 방법을 모른다
Bibu

102

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
<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>. 당신은 매니페스트에서 원하지 않는 한 제거해야
Jomia

1
좋은 대답 jomia.하지만 한 번에 한 가지 질문, 한 번에 하나의 실행기 활동 만 있습니다. 같은 코드가 eumlaotr로 실행되지만 장치에서는 보안 예외가 표시됩니다. 정확하게 설명해 주시겠습니까?
Tofeeq Ahmad 2011

기기에서 앱을 제거하고 다시 설치해야한다고 생각합니다. 그런 다음 작동합니다
Jomia

16

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

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

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


로그를 보면 도움이 될 것이라고 확신했습니다. 여기에 전체 매니페스트 파일을 붙여 넣으십시오.
Muhammad Shahab 2010-11-12

<manifest xmlns : android = " schemas.android.com/apk/res/android"package = "com.i10n.notifier"android : versionCode = "1"android : versionName = "1.0"> <uses-permission android : name = "android.permission.RECEIVE_BOOT_COMPLETED"/> <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"/>
Swathi EP

<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"/> <application android : icon = "@ drawable / icon"android : label = "@ string / app_name"android : theme = "@ android : style / Theme.NoTitleBar "> <activity android : name =". GWVectraNotifier "android : label ="@ string / app_name "android : theme ="@ android : style / Theme.Dialog ">
Swathi EP

<intent-filter> <action android : name = "android.intent.action.MAIN"/> <category android : name = "android.intent.category.LAUNCHER"/> </ intent-filter> </ activity> < / application> </ manifest>
Swathi EP

위의 3 개 댓글에 내 알리미 애플리케이션 매니페스트 파일을 붙여 넣었습니다. 답장을 보내 주셔서 감사합니다.
Swathi EP


6

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

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

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

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


1

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


또한 시스템 수준의 고급 스러움을 즐기려면 시스템 / priv-app 파티션에 앱이 있는지 확인해야합니다. KitKat 이상 장치에서 필요합니다.
Naren

1

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

예 : Manifest.xml

여기에 이미지 설명 입력

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

여기에 이미지 설명 입력

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

행운을 빕니다


1

target sdk19 이후 버전의 kitkat 버전 을 변경하여이 예외를 해결했습니다.AndroidManifest.xml.

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

BTW, 현재 Gradle이이 작업을 처리하고 Android 개발자는 매니페스트 파일에 sdk 버전을 지정하지 않습니다
kiedysktos

1
끔찍한 해결책이 있습니다. 아래로 향하지 마십시오.
Jared Burrows

이것은 작동하지만 해결 된 것보다 더 많은 문제를 일으킬 가능성이 높습니다. 제 생각에는 그게 전부
EVREN Ozturk

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.