본문 바로가기
안드로이드/개발자 일상

안드로이드 멀티퍼미션 라이브러리 (Dexter)

by 차누감 2020. 4. 27.

이번 예제는 안드로이드에서 퍼미션을 요청하는 다이얼 로그를 자동으로 띄워주는 편리한 라이브러리입니다.

GitHub에 들어가보면 굉장히 Star를 많이 받은 라이브러리입니다.

싱글 퍼미션 및 멀티 퍼미션에 대한 자세한 사항은 아래 깃허브 주소를 확인해 주세요.

https://github.com/Karumi/Dexter

 

Karumi/Dexter

Android library that simplifies the process of requesting permissions at runtime. - Karumi/Dexter

github.com


<실행 화면> 편리하게 권한을 요청할 수 있습니다. ( 예제에서는 카메라와 위치 권한을 이용했습니다. )


예제에서는 여러 퍼미션(멀티 퍼미션)을 요청할 시 코드입니다.

 

우선 라이브러리를 사용하기 위해 추가해줍니다. ( 추가하고 Sync Now를 눌러줍니다. )

Gradle

dependencies {
     implementation 'com.karumi:dexter:6.1.0'
}

 

요청한 권한을 Manifest에 등록합니다. ( 예제에서는 카메라와 위치 권한을 이용했습니다. )

AndroidManifest.xml

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

 

<핵심 코드> - onPermissionsChecked(), onPermissionRationaleShouldBeShown()두 메소드가 override됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  Dexter.withActivity(this)
          .withPermissions(
                  Manifest.permission.CAMERA,                  // 카메라
                  Manifest.permission.ACCESS_FINE_LOCATION)   // 위치
          .withListener(new MultiplePermissionsListener(){
              @Override
              public void onPermissionsChecked(MultiplePermissionsReport multiplePermissionsReport) { // 권한 여부를 다 묻고 실행되는 메소드
               
                  // check if all permissions are granted
                  if (multiplePermissionsReport.areAllPermissionsGranted()) {
                      Toast.makeText(MainActivity.this"모든 권한 허용", Toast.LENGTH_SHORT).show();
                  }
              }// onPermissionsChecked()..
 
              @Override
              public void onPermissionRationaleShouldBeShown(List<PermissionRequest> list, PermissionToken permissionToken) { // 이전 권한 여부를 거부한 권한이 있으면 실행되는 메소드
                        // 파라미터로 전달된 list : 거부한 권한 이름이 저장되어 있습니다.
              }// onPermissionRationaleShouldBeShown()..
          })
          .check();
 

이제 MainActivity.java에 적용하겠습니다.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package com.example.ex_multipermissions;
 
 
import android.Manifest;
import android.content.DialogInterface;
import android.provider.Settings;
 
 
 
public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            Dexter.withActivity(this)
                    .withPermissions(
                            Manifest.permission.CAMERA,                // 카메라
                            Manifest.permission.ACCESS_FINE_LOCATION)   // 위치
                    .withListener(new MultiplePermissionsListener(){
                        @Override
                        public void onPermissionsChecked(MultiplePermissionsReport multiplePermissionsReport) { // 권한 여부를 다 묻고 실행되는 메소드
                            // check if all permissions are granted
                            if (multiplePermissionsReport.areAllPermissionsGranted()) {
                                Toast.makeText(MainActivity.this"모든 권한 허용", Toast.LENGTH_SHORT).show();
                            }
 
                        }// onPermissionsChecked()..
 
                        @Override
                        public void onPermissionRationaleShouldBeShown(List<PermissionRequest> list, PermissionToken permissionToken) { // 이전 권한 여부를 거부한 권한이 있으면 실행되는 메소드
                            Toast.makeText(MainActivity.this"list : "+list, Toast.LENGTH_LONG).show();        // 거부한 권한 이름이 저장된 list
 
                            showSettingsDialog(); // 권한 거부시 앱 정보 설정 페이지를 띄우기 위한 임의 메소드
                        }// onPermissionRationaleShouldBeShown()..
                    })
                    .check();
        }
    }// onCreate()..
 
    // 만약 권한을 거절했을 경우,  다이얼로그 띄우기 위한 임의 메소드
    private void showSettingsDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
        builder.setTitle("Need Permissions");
        builder.setMessage("This app needs permission to use this feature. You can grant them in app settings.");
        builder.setPositiveButton("GOTO SETTINGS"new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
                openSettings(); // 어플리케이션 정보 설정 페이지 띄움.
            }
        });
        builder.setNegativeButton("Cancel"new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        });
        builder.show();
    }// showSettingsDialog()..
 
    // 어플리케이션 정보 설정 페이지
    private void openSettings() {
        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        Uri uri = Uri.fromParts("package", getPackageName(), null);
        intent.setData(uri);
        startActivityForResult(intent, 101);
    }// openSettings()..
 
}// MainActivity class..
 
 
 

<실행 화면> 요청한 권한 여부 후, onPermissionsChecked() 메서드가 실행됩니다.

 

<실행 화면> 재 실행 시, 거부한 권한이 있을 경우 onPermissionRationaleShouldBeShown() 메서드가 실행된다.

 

 

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 거부하고

 

onPermissionRationaleShouldBeShown(List<PermissionRequest> list, PermissionToken permissionToken)의

파라미터로 전달된 list의 내용을 로그로 보았습니다.

[Permission name: android.permission.ACCESS_FINE_LOCATION, Permission name: android.permission.CAMERA]

 

 

<추가> - 아래 권한 그룹은 사용하려면, 꼭 사용자에게 권한을 요청해야 하는 그룹입니다.

안드로이드 개발자 사이트 권한 그룹

https://developer.android.com/guide/topics/security/permissions#perm-groups

 

시스템 권한  |  Android 개발자  |  Android Developers

Permissions Google I/O 2015—Android M Permissions: Best Practices for Developers Android is a privilege-separated operating system, in which each application runs with a distinct system identity (Linux user ID and group ID). Parts of the system are…

developer.android.com

 

댓글