티스토리 뷰


안녕하세요 박스여우입니다.


약 2달전쯤에 DSM 알리미 앱이 강제종료 된다는 문의가 자주 있었습니다.

오류를 문의하는 사람들의 한가지 특징이 안드로이드 6.0 환경이였습니다. 원인파악을 해보니 안드로이드 6.0버전부터는 보안이 강화되어(?) 기존에 manifest에 퍼미션을 등록하는 방식이 다르게 바뀌었더군요


그래서 오늘은 이미 해결했지만 늦게나마 안드로이드 6.0 버전 이상에서 퍼미션을 얻는 방법을 알아보겠습니다.

Android 6.0 / API Level 23

안드로이드 6.0버전 이하에서는 Manifest에 사용하고자 하는 퍼미션을 등록하면 자유롭게 사용이 가능했습니다. 하지만 안드로이드 6.0버전 이상부터는 코드 동작중에 필요한 퍼미션들을 허용받는 런타임 권한 모델을 사용해야 합니다.


런타임 권한 모델 방식으로 변경된 이후에는 퍼미션을 허용받는 대표적인 방법으로 메세지를 통해 허용을 받게 됩니다. 또, 작업관리자에서 앱 정보창을 통해 해당 앱의 퍼미션을 자유롭게 On/Off가 가능합니다.


 본격적으로 권한 받기

우선 핵심코드를 먼저 보고 그 뒤에 코드를 설명하겠습니다.


■ Permission 받는 핵심 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    private void getPermission(){
 
        if(Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
 
            boolean hasPermission = checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED;
 
            if (!hasPermission) {
 
                if (shouldShowRequestPermissionRationale(Manifest.permission.READ_PHONE_STATE)) {
 
                    final int REQUEST_CODE = 2;
 
                    ActivityCompat.requestPermissions(
 
                            thisnew String[]{Manifest.permission.READ_PHONE_STATE},
 
                            REQUEST_CODE);
 
                } else {
 
                    Toast.makeText(MainActivity.this"퍼미션을 허용하지 않았습니다.", Toast.LENGTH_SHORT).show();
 
                }
 
                return;
 
            }
 
        }
 
    }


cs


우선 getPermission 메소드에서 가장 처음 퍼미션 권한을 얻기 위해서 버전을 체크합니다.(3번 라인) 퍼미션 권한을 요청하여 얻는 방식은 안드로이드 6.0버전 이상부터 가능하기 때문에 안드로이드 스튜디오같은 경우는 버전체크를 하지 않으면 에러처리를 합니다.


버전이 6.0이상일 경우 퍼미션이 이미 허용되어 있는지 체크합니다.(5번 라인) 퍼미션이 이미 허용되어 있으면 다시 물어볼 필요가 없겠죠?


그리고, 퍼미션이 허용되어 있지 않을때 퍼미션을 요청하는 메세지를 띄울 수 있는지 체크합니다.(9번 라인) 위의 퍼미션 권한 메세지박스를 보시면 Never ask again이라는 체크박스를 통해 거부를 했을때 메세지를 띄울 수 없게 됩니다.


마지막으로 만약 퍼미션 요청 메세지가 거부당하지 않았다면 요청하는 메세지를 띄우게 됩니다.(11번 라인 ~ 17번 라인)

이때, 배열에 받고자 하는 퍼미션을 담아서 파라미터로 넘겨줍니다. 그리고 REQUEST_CODE 는 각 작업을 구별하기 위한 코드 입니다. 자세한 내용은 아래에 CallBack을 통해 살펴봅시다!



getPermission CallBack


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    @Override
 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
 
        if(requestCode==2){
 
        if(grantResults.length == 1 && grantResults[0== PackageManager.PERMISSION_GRANTED) {
 
            Toast.makeText(MainActivity.this"퍼미션 권한이 허용되어 있습니다", Toast.LENGTH_SHORT).show();
 
        } else {
 
            Toast.makeText(MainActivity.this"퍼미션을 허용하지 않았습니다.", Toast.LENGTH_SHORT).show();
 
        }
 
        }
 
    }
cs


onRequestPermissionsResult메소드는 퍼미션 요청 메세지 박스에 대한 Callback - 처리 결과를 보여줍니다. 위에서 언급한 REQUEST_CODE 가 int requestCode로 다시 전달받았습니다. 이는 한번에 여러 퍼미션을 받게 되어 Callback이 중복되었을때 각 작업을 구별하여 정확한 로직으로 작동되게 하기 위한 코드 입니다.(5번 라인)


마지막으로 퍼미션이 허용이 됐는지 체크를 하게 됩니다. (7번 라인)



이상으로! 안드로이드 6.0 이상의 런타임 권한 모델을 해결하는 방법에 대해 알아보았습니다!


참조자료

Google Developers


댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함