안드로이드 마쉬멜로우 미만버전에서 앱 권한은 AndroidManifest.xml에 지정하고, 설치시에 앱이 사용하는 권한을 보여주기만 했습니다.
그래서 그 앱이 실제로 언제 그 권한을 사용하는지 실제로 사용하고는 있는지 등을 유저가 알 수 없었습니다.
그래서 마쉬멜로우 에서 실제 권한 요청시에 유저에게 권한을 사용 할지 확인 받는 과정이 추가 되었습니다.
당 팝업에서 권한을 허용 할 것인가? 하지 않을 것인가? 해당 권한을 다음 부터 묻지 않고 처리 할 것인가? 등을 처리 할 수 있습니다.
권한 확인 및 변경
그럼 이렇게 지정한 권한 설정을 한번에 확인 하거나 지정 사항을 변경 하고 싶을 때는 어떻게 해야 하는가.
해당 어플리케이션의 어플리케이션 정보 창을 찾아서 (버전과 회사에 따라서 다양한 방법이 있지만 대략적으로 설정 -> 어플리케이션 목록 -> 어플리케이션 정보 순서로 접근 하는 방법을 지원하고 있다.)
플리케이션 정보에서 Permissions를 선택하면 권한 목록을 볼 수 있으며, 체크박스를 이용하여 권한을 부여하거나 제거 할 수 있습니다.
실제 코드 구현
( WRITE_EXTERNAL_STORAGE 권한을 예로 삼아서 이해해 봅시다.)
- AndroidManifest.xml 에 추가.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="fail.toepic.blink">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
2. 이제 실제로 코드를 사용하는 시점에서 권한을 체크하는 코드를 넣어야 합니다.
2–1 해당 권한이 현재 허용 되어 있는가를 확인 하는 함수는 checkSelfPermission(String permission) 함수를 이용하여 체크 할 수 있습니다.
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
Log.v(TAG,"Permission is granted");
return true;
}
해당 함수는 주어진 권한을 체크하여 해당 퍼미션이 허용 되어있는지 (PackageManager.PERMISSION_GRANTED) 허용되어 있지 않은지 (PackageManager.PERMISSION_DENIED) 반환 합니다.
체크 결과 퍼미션이 허용 되어 있지 않다면. 유저에게 허용 해 달라고 팝업 메시지를 보내야 합니다.
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
requestPermissions 를 이용하여 권한을 요청하게 되면. 해당 함수는 즉시 리턴하며, 해당 팝업의 응답 결과는. onRequestPermissionsResult 함수를 호출 하게 되며 따라서 해당 함수를 오버 라이딩 하여 응답 처리를 해야 합니다.
하여 최종적으로는 하기와 같은 코드가 됩니다.