안드로이드 6.0에서 SecurityException 처리방법(Call requires permission which may be rejected by user....)

 안드로이드 6.0버전(API-23)부터 애플리케이션을 설치할 때 권한을 묻지 않고 그대로 설치한 후 해당 앱을 실행하는 도중 특정한 권한이 필요하게 되었을 때 사용하고자 하는 권한을 묻는 방식으로 Permission을 설정하는 방식으로 변경되었습니다.



 이로 인해 안드로이드 6.0부터 애플리케이션을 제작할 때 특정 부분에서 Permission을 필요로 할 때 사용자에게 사용 여부를 묻는 방식으로 설계를 해야 합니다. 기존의 버전에서 처럼 제작을 하게 될 경우 아래와 같이 붉은 밑줄이 생기면서 설계자에게 경고를 합니다.



 기존의 방식대로면 전혀 문제가 될 일이 없습니다만 안드로이드 마시멜로에서 부터는 특정 권한을 필요로 하는 작업을 수행하기 위해 액세스를 하기 직전 권한 허용 여부를 확인하여야 이 에러를 해결할 수 있습니다.


1. try-catch로 SecurityException 처리하기

기존 코드를 그대로 사용할 경우 가장 간단한 방법으로 실행하고자 하는 소스코드 앞뒤로 try-catch Exception을 사용하는 방법입니다. 기존 코드를 완전히 뜯어고칠 필요 없이 try-catch를 추가하기 때문에 매우 간단합니다만 사용자가 Permission을 허가하지 않을 경우 이 코드를 실행하지 못하고 바로 Exception올 빠지게 됩니다.



2. checkSelfPermission()함수를 사용하여 권한여부 확인하기

 사용하고자 하는 Permission을 처리하기 전 사용자가 권한을 허가하였는지 미리 파악한 후 소스코드를 실행하는 방식입니다. try-catch로 SecurityException을 처리하는 것보다 좀 더 디테일하게 권한 사용 여부를 확인하며 만약 권한이 허가되지 않았을 경우 if-else문을 통해 사용자에게 다시 한 번 Permission을 허가해줄지 확인할 수 있도록 코딩할 수 있습니다.



 애플리케이션을 설치할 때 수두룩 나오는 Permission들이 어떤 부분에서 사용되는 지를 전혀 알길이 없어 바로 OK한 후 애플리케이션을 내려받아왔었는데 이번 6.0의 변화로 실행 도중에 어떤 상황에서 Permission이 사용되는지 좀 더 자세히 알 수 있어 쓸데없는 권한 사용을 남발하는 것을 줄일 수 있어 좋습니다. 다만, 이전처럼 한 번에 권한을 모두 갖는 것이 아니다 보니 실행 도중 Permission을 묻는 부분을 일일히 코딩해야 하는 것이 어렵다는건 아직까지는 적응이 되지 않습니다.

 무쪼록 앞으로도 안드로이드는 기존보다는 좀 더 나은 방향으로 발전할 것이라 기대해봅니다.