[Android 6.0 마시멜로] 권한 오류에 대한 트러블슈팅

Posted by Everyharu
2016. 6. 9. 16:08 IT/Android

잘 되던 개발중인 앱이 어느날 갑자기 안드로이드 업데이트 이후 안되기 시작했다. 이유가 뭘까..? 곰곰히 살펴본 결과

manifest 설정에도 문제가 없었고 결과적으로 안드로이드 6.0 이후에 앱마다 권한설정을 체크할 수 있는 부분이 생겼다는 것을 알 수 있었다


잘되던 위치체크가 안된다던가 전화번호를 갑자기 못얻어 온다던가 하는 경우에는 이 경우일 확률이 높다.
아마 마켓에서 바로 다운받았다면 이러한 문제가 생기진 않을것같다. 그랬다가는 일반사용자들의 불만이 엄청나질테니까..
때문에 개발중에는 신경을 써야할듯하다.


에러메시지는 다음과 같이 나왔었다. 꼭 manifest 설정을 안해준게 아닐까 생각이 들었지만 정확하게 설정이 되어있다.

java.lang.RuntimeException: Unable to create service com.recorder.RecorderService: java.lang.SecurityException: getLine1NumberForDisplay: Neither user 10281 nor current process has android.permission.READ_SMS.

                                                                       at android.app.ActivityThread.handleCreateService(ActivityThread.java:3817)

                                                                       at android.app.ActivityThread.access$2100(ActivityThread.java:221)

                                                                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1882)

                                                                       at android.os.Handler.dispatchMessage(Handler.java:102)

                                                                       at android.os.Looper.loop(Looper.java:158)

                                                                       at android.app.ActivityThread.main(ActivityThread.java:7225)

                                                                       at java.lang.reflect.Method.invoke(Native Method)

                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)

                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

                                                                    Caused by: java.lang.SecurityException: getLine1NumberForDisplay: Neither user 10281 nor current process has android.permission.READ_SMS.

                                                                       at android.os.Parcel.readException(Parcel.java:1620)

                                                                       at android.os.Parcel.readException(Parcel.java:1573)

                                                                       at com.android.internal.telephony.ITelephony$Stub$Proxy.getLine1NumberForDisplay(ITelephony.java:4874)

                                                                       at android.telephony.TelephonyManager.getLine1NumberForSubscriber(TelephonyManager.java:2447)

                                                                       at android.telephony.TelephonyManager.getLine1Number(TelephonyManager.java:2425)

                                                                       at com.a1tech.recorder.RecorderService.onCreate(RecorderService.java:106)

                                                                       at android.app.ActivityThread.handleCreateService(ActivityThread.java:3807)

                                                                       at android.app.ActivityThread.access$2100(ActivityThread.java:221) 

                                                                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1882) 

                                                                       at android.os.Handler.dispatchMessage(Handler.java:102) 

                                                                       at android.os.Looper.loop(Looper.java:158) 

                                                                       at android.app.ActivityThread.main(ActivityThread.java:7225) 

                                                                       at java.lang.reflect.Method.invoke(Native Method) 

                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 

                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 



안드로이드6 이상에서 앱의 권한을 허용해주기 위한 방법은 다음과 같다.


   

그냥 쉽게 말해서 설정 -> 애플리케이션 관리자 -> 해당앱 -> 애플리케이션 정보 -> 권한 으로 들어가 권한을 허용시켜주면된다.



***** 추가사항 *****

마켓에 올려도 해결안된다. 기존처럼 설치시에 권한을 할당받으려면 targetSDK 버전을 낮춰야한다.
그런데 이미 한번 sdk버전을 올려서 마켓등록을 했을경우 sdk버전을 다운시키는건 또 안된다.
그렇다면 6이상에서 권한할당을 받기 위해서는 어떻게 해야할까?
앱실행시 권한체크하는 부분을 넣어서 권한이 없다면 권한설정페이지로 보내는 작업을 진행해야한다;;;;

이건 뭐 보안은 둘째치고 너무 번거롭게 만든다. 기존앱들 다 권한설정 따로 안해줘도 잘만되는데 이것만 괜히 불편하게 만들었다고 불평이 나와도 할말이없는 상황이다.
보안은 둘째치고 사용자 편의성을 위해 targetSDK버전을 낮추자.