개발자 블로그

SecurityException - Permission Denial:starting Intent... 오류 본문

프로그래밍/안드로이드

SecurityException - Permission Denial:starting Intent... 오류

로이드.Roid 2017. 1. 23. 02:30

처음 이 에러가 발생하지는 꽤 오래 됐는데 이제서야 해결을 했다. 원인을 찾고나면 참 별거 아닌건데.. 지금까지 버그 수정했던 것들 중 제일 나를 괴롭혔던 문제같다. (사실은 아직 해결못한 놈들이 더 나를 괴롭히고 있겠지만..)

계속해서 발생하던 에러는 아니고, 삼성 단말 중 안드로이드 마시멜로우 버전에서만 발생했다. 

SecurityException이 뜨게되면 제일 먼저 의심하는게 AndroidManifest.xml 파일의 <uses-permission>이지만 이건 그런 문제가 아니었다. 아,, 일단 먼저 에러메시지를 봐야겠구나..

전체 에러메시지는 아래와 같다. (패키지명은 *로 가렸다.)

Fatal Exception: java.lang.SecurityException: Permission Denial: starting Intent 
   { act=android.intent.action.VIEW cmp=com.android.stk/.StkMenuActivity } from ProcessRecord
   {ba3f916 24470:com.*************.*************/u0a148} (pid=24470, uid=10148) not exported from uid 1001
       at android.os.Parcel.readException(Parcel.java:1620)
       at android.os.Parcel.readException(Parcel.java:1573)
       at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:3131)
       at android.app.Instrumentation.execStartActivity(Instrumentation.java:1540)
       at android.app.Activity.startActivityForResult(Activity.java:4283)
       at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:48)
       at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:75)
       at android.app.Activity.startActivityForResult(Activity.java:4230)
       at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:856)
       at android.app.Activity.startActivity(Activity.java:4567)
       at android.app.Activity.startActivity(Activity.java:4535)
       at com.*************.*************.gallery.GalleryAdapter$MyItemHolder.onClick(GalleryAdapter.java:279)
       at android.view.View.performClick(View.java:5702)
       at android.view.View$PerformClick.run(View.java:22541)
       at android.os.Handler.handleCallback(Handler.java:739)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:158)
       at android.app.ActivityThread.main(ActivityThread.java:7229)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

구글에서 Permission Denial starting Intent.. 관련 내용으로 검색을 하면 AndroidManifest.xml 파일에서 메인 액티비티의 속성을 android:exported="true"로 지정하라는 내용이 나온다. 

참고로 에러 발생하는 곳의 소스코드는 아래와 같다.

Intent intent = new Intent(Intent.ACTION_VIEW, imgUri);
mContext.startActivity(intent);

의도한 바는 이미지의 uri를 전달해서 이미지를 볼 수 있는 앱(일반적으로 갤러리앱)으로 띄우는 것이었다.

위 내용대로라면.. com.android.stk/.StkMenuActivity의 AndroidManifest.xml 파일의 exported 속성을 변경해야 된다는 소린데.. 애초에 내가 건드릴 수 있는 영역도 아니거니와 .StkMenuActivity가 뭐하는 놈인지도 알 수가 없었다. (검색을 해보니깐.. Sim Tool Kit의 약자로 Stk를 따온게 아닌가 싶기는 한데.. SIM이랑 무슨 연관이 있는건지도 모르겠다.)

뭐.. 원인을 찾고 난 뒤에 알게 된 것이긴 하지만 애초에 저 메시지는 전혀 의미가 없었다.


오류의 원인은.. 조금은 어이 없지만, imgUri에 해당하는 이미지가 저장소에서 삭제되었기 때문에 발생하는 문제였다. 참 허탈한 기분이 들었다. 왜 이걸 체크하지 않았던걸까.. 하는 자책도 들고.. 에러 메시지는 대채 왜 저런식으로 나왔던걸까.. 싶기도 하고..

해결은 아주 간단했다. 애초에 이미지 파일의 path를 가지고 있었기 때문에 아래 코드처럼 exists()를 이용해서 존재여부를 한번 체크하도록 했다.

File img = new File(_path);

return img.exists();


참고로 삼성 킷캣 단말에서는 수정전 동일한 코드에 대해서 아래 처럼 동작한다.


그리고 LG 롤리팝, 마시멜로우 단말에서는 아래처럼..

왼쪽 화면에서 '갤러리'를 선택하면 오른쪽 이미지처럼 알림 메시지를 보여준다.

일차적으로 체크로직을 추가하지 않은 내 잘못이 크겠지만, 삼성 마시멜로우 단말의 동작방식이.. 썩 좋은 것 같지는 않다. 

일반 사용자들은 보통 삼성폰을 좋아라하고 LG폰은 안좋다고 이야기하던데(우리 아부지도 그렇다..) 나는 잘 모르겠다. 삼성폰은 구형 단말에서도 이미지 선택을 위해서 갤러리 띄우려고 하면 별도로 처리하는 로직을 추가했어야 됐는데.. 흠..

LG폰도 삼성폰도 다 써봤지만 2년 ~ 3년에 한번꼴로 전화기를 바꾸는 내 입장에서는 몇 세대를 건너뛰고 사용하는거니깐 서로 비교해서 판단은 못하겠다. 

아니 이런 얘기를 쓰려고 시작한게 아닌데 이상한데로 또 흘러버렸네..


나와 같은 문제를 겪는 사람이 과연 몇이나 될까 싶지만.. 나를 한참동안 괴롭혔던 문제를 해결한 기념으로 포스팅을 작성한다. 근데 쓰고나니깐 더 간단한 문제처럼 느껴져서 부끄럽기도 하고.. 화도 나려고하고 그러네. 헤헤.


Comments