이번 예제는 안드로이드에서 퍼미션을 요청하는 다이얼 로그를 자동으로 띄워주는 편리한 라이브러리입니다.
싱글 퍼미션 및 멀티 퍼미션에 대한 자세한 사항은 아래 깃허브 주소를 확인해 주세요.
https://github.com/Karumi/Dexter
<실행 화면> 편리하게 권한을 요청할 수 있습니다. ( 예제에서는 카메라와 위치 권한을 이용했습니다. )
예제에서는 여러 퍼미션(멀티 퍼미션)을 요청할 시 코드입니다.
우선 라이브러리를 사용하기 위해 추가해줍니다. ( 추가하고 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.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.widget.Toast;
import com.karumi.dexter.Dexter;
import java.util.List;
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) {
openSettings(); // 어플리케이션 정보 설정 페이지 띄움.
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
}// 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
'안드로이드 > 개발자 일상' 카테고리의 다른 글
코틀린을 배워야 하는 이유 (0) | 2020.05.07 |
---|---|
안드로이드 이벤트 버스 ( otto 라이브러리 ) (8) | 2020.04.29 |
안드로이드 Service ( 자동 종료되지 않는 서비스 주의점 ) (7) | 2020.04.24 |
안드로이드 ExpandableListAdapter( 하위 목록까지 보여주기 ) (7) | 2020.04.23 |
안드로이드 베터리 최적화 풀기 ( 잠자기 모드 해제 ) (11) | 2020.04.22 |
댓글