개발자 블로그
SecurityException - Permission Denial:starting Intent... 오류 본문
처음 이 에러가 발생하지는 꽤 오래 됐는데 이제서야 해결을 했다. 원인을 찾고나면 참 별거 아닌건데.. 지금까지 버그 수정했던 것들 중 제일 나를 괴롭혔던 문제같다. (사실은 아직 해결못한 놈들이 더 나를 괴롭히고 있겠지만..)
계속해서 발생하던 에러는 아니고, 삼성 단말 중 안드로이드 마시멜로우 버전에서만 발생했다.
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년에 한번꼴로 전화기를 바꾸는 내 입장에서는 몇 세대를 건너뛰고 사용하는거니깐 서로 비교해서 판단은 못하겠다.
아니 이런 얘기를 쓰려고 시작한게 아닌데 이상한데로 또 흘러버렸네..
나와 같은 문제를 겪는 사람이 과연 몇이나 될까 싶지만.. 나를 한참동안 괴롭혔던 문제를 해결한 기념으로 포스팅을 작성한다. 근데 쓰고나니깐 더 간단한 문제처럼 느껴져서 부끄럽기도 하고.. 화도 나려고하고 그러네. 헤헤.
'프로그래밍 > 안드로이드' 카테고리의 다른 글
안드로이드 OS 지원 중단 안내 문구작성 예시 (0) | 2017.08.22 |
---|---|
안드로이드 에뮬레이터에서 파일관리자 앱 사용 방법 (0) | 2017.01.25 |
Device Art Generator로 만든 이미지를 구글 플레이 스크린샷에 등록하면 안되나? (0) | 2016.12.31 |
drawText STROKE로 그리는 경우 깨지는 문제 (0) | 2016.12.30 |
WebViewClassic.java NullPointException - 난 WebView 안쓰는데?? (0) | 2016.12.26 |