안드로이드 권한 획득 방식
마시멜로 - Android 6.0(API 레벨 23) 이전 버전
앱 설치 단계에서 권한을 부여하며, AndroidManifest.xml에 권한을 설정하여 영구적으로 앱의 권한을 획득할 수 있다.
사용자가 앱을 설치한 후에는 앱을 제거하는 것이 권한을 취소할 수 있는 유일한 방법이다.
마시멜로 - Android 6.0(API 레벨 23) 이후 버전
AndroidManifest.xml에 권한을 설정하고, 매번 특정 권한이 필요한 기능을 실행하기 전에 반드시 권한 획득 여부를 확인해야 한다. - RunTime Permission
AndroidManifest.xml에 정의한 모든 권한을 RunTime Permission 방식으로 권한을 획득할 필요는 없고, 구글이 정의한 Normal Permission과 Dangerous Permission중 Dangerous Permission에 대해서만 권한을 획득하면 된다.
사용자가 부여한 권한을 언제든지 시스템 설정에서 취소할 수 있다.
안드로이드 권한 획득 방법
AndroidManifest.xml에 <uses-permission> 태그를 사용하여 권한사용을 명시한다.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ContextCompat.checkSelfPermission 메서드를 통해 해당 권한이 획득되었는지 확인한다. 앱에 권한이 있는경우 PackageManager.PERMISSION_GRANTED, 권한이 없는 경우 PackageManager.PERMISSION_DENIED를 반환한다.
package="com.android.app.myapp" >
<uses-permission android:name="android.permission.RECEIVE_SMS" />
...
</manifest>
// Assume thisActivity is the current activity |
해당권한이 필요한 이유를 설명해야 한다면 shouldShowRequestPermissionRationale 메서드를 사용한다.
- 앱이 해당 권한에 대해 요청한 이력이 없는 경우(처음인 경우) False 반환
- 다시 묻지 않기를 선택하고 거절한 이력이 있는 경우 False 반환
- 다시 묻지 않기를 선택하지 않고 거절한 이력이 있는 경우 True 반환
if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { |
앱에 권한이 없는경우 ActivityCompat.requestPermissions 메서드를 통해 권한을 요청할 수 있다.
if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { |
응답을 요청하는 대화상자에 사용자가 응답하면 onRequestPermissionResult 메서드를 호출하여 권한요청의 결과를 받는다.
따라서 메서드를 오버라이딩하여 권한요청 수락 및 거부한 상황에 대한 후속처리를 한다. 수동으로 앱 설정할 수 있는 다이로그를 추가하는 것도 좋다.
@Override /* 권한 허용시 처리 */ /* 권한 거부시 처리 */ |