본문 바로가기
Android/Base

Android Runtime Permission 관리

by Pretty Garbage 2017. 9. 4.

안드로이드 6.0 (마시멜로) API 23 이후부터 적용.


단말기의 기능들에 대한 권한을 사용자의 동의 얻어야 한다.



런타임 권한 모델


API 22 이하의 모델의 경우 앱이 설치될 때에 Manifest에서 퍼미션 등록을 해놓으면 등록해놓은 권한들을 요청해서

기능들을 사용할 수 있지만 Target API 23이상으로 빌드된 앱이 안드로이드 6.0(마시멜로)버전 이상에서 동작하게 된다면

앱 실행 중에 필요한 권한을 요청해야 한다.



(이런식으로 ... 구글링해서 이미지 복붙)



권한 요청을 해야하는 목록은 아래의 URL을 첨부한다.

https://developer.android.com/training/permissions/requesting.html?hl=ko



서포트 라이브러리 (support-v4 library.revision 23)


주요 메서드


● ContextCompat.checkSelfPermission(): 현재 앱이 특정 권한을 갖고 있는지 확인 가능함.

● ActivityCompat.shouldShowRequestPermissionRationale():  사용자에게 권한 요청을 질의함.

● ActivityCompat.requestPermission(): 권한을 요청함.

● onRequestPermissionsResult(): 권한을 요청후 결과.



메서드를 사용하기에 앞서 위 메서드들은 Context와 Activity에 대한 정보를 필요로 한다. (샘플은 위 URL을 타면 확인가능)


첫번째의 checkSelfPermission()와 세번째의 requestPermission()을 사용한 샘플

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private void samplePermission(){
        //if(ContextCompat.checkSelfPermission("컨텍스트 정보의 자리","요청할 권한") 
        // == PackageManager.PERMISSION_GRANTED)
        if(ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) 
                == PackageManager.PERMISSION_GRANTED){
            //이 영역은 Manifest.permission.ACCESS_FINE_LOCATION이 접근 승낙 상태일 때
        }else{
            //이 영역은 권한 접근이 거부되었을 때 입니다.
            
            //접근이 거부되었을 때에 사용자에게 접근 권한 설정을 요구하는 다이얼로그를 띄우기 위해서
            //requestPermission을 씁니다. requestPermission(액티비티의 정보,String[]의 권한요청명령
            // ,리퀘스트 코드) 입니다.
            //여기서 리퀘스트 코드는 후에 onRequestPermissionResult() 메서드에 결과물이 전달될 시,
            //결과물들을 구분 짓는 인덱스 번호입니다.
            ActivityCompat.requestPermissions(this
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION},0);
        }
 
    }
cs


하지만 사용자가 권한 요청을 거부하는 경우도 있다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 private void samplePermission(){
        //if(ContextCompat.checkSelfPermission("컨텍스트 정보의 자리","요청할 권한")
        // == PackageManager.PERMISSION_GRANTED)
        if(ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED){
            //이 영역은 Manifest.permission.ACCESS_FINE_LOCATION이 접근 승낙 상태일 때
        }else{
            //이 영역은 권한 접근이 거부되었을 때 입니다.
            if(ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.ACCESS_FINE_LOCATION)){
                //사용자가 다시 보지 않기에 체크를 하지 않고, 권한 설정을 거절한 이력이 있는 경우
            }else{
                //사용자가 다시 보지 않기에 체크하고, 권한 설정을 거절한 이력이 있는 경우
            }
            //사용자에게 권한 요청 다이얼로그를 띄우는데 만약 사용자가 다시 보지 않기에 체크를 했을 경우
            //곧바로 onRequestPermissionResult가 실행된다.
            ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},0);
        }
 
    }
cs


 

마지막으로 최종적으로 처리를 해줘야할 메서드가 onRequestPermissionResult()메서드이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResult){
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        //requestPermission 메서드에서 리퀘스트 코드로 지정한, 마지막 매개변수에 0을 넣어 줬으므로
        if(requestCode == 0){
            // requestPermission의 두번째 매개변수는 배열이므로 아이템이 여러개 있을 수 있기 때문에 결과를 배열로 받는다.
            // 해당 예시는 요청 퍼미션이 한개 이므로 i=0 만 호출한다.
            if(grantResult[0== 0){
                //해당 권한이 승낙된 경우.
            }else{
                //해당 권한이 거절된 경우.
            }
        }
    }
cs

 

 

 

참고한 블로그 : http://mommoo.tistory.com/49

참고한 URL : https://developer.android.com/training/permissions/requesting.html?hl=ko

 

참고블로그에서 위 관련 방법이 귀찮으셨는지 더개발하기 쉽도록 라이브러리를 만들어 공유하셨다.

https://github.com/Mommoo/MommooPermission 참고.