오늘 주로 다룰 권한은 WRITE_EXTERNAL_STORAGE 아마 다른 권한도 마찬가지일 것이다.
내 앱이 모든 미디어 권한 허용이 필요하다묜
<uses-permission
android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
메니페스트에 이 코드를 추가하면 되지만 아마 구글 스토어에서 빠꾸 먹을 확률이 크다.
꼭 필요한게 아니라면 넣지 말자.
일부 허용은
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
데이터를 백업하려면 WRITE_EXTERNAL_STORAGE 가 필요한데 유저가 권한 거부를 한번 누르면 창이 다시 안떠서 애를 먹었었다.
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE_PERMISSIONS);
//REQUEST_CODE_PERMISSIONS = 100;
처음에 권한 요청을 하면 이 코드를 통해 권한 창이 뜬다. 여기서 유저가 거절을 하면
if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE_PERMISSIONS);
}
이 코드를 통해 유저에게 한번 더 권한을 요청할 수 있다.
안드로이드 공식 문서를 보면 shouldShowRequestPermissionRationale 를 사용할 때, 이 권한이 왜 필요한지 유저에게 자세히 설명하라고 나와있다.
또 요청하면 되지 굳이 ? 싶었지만 세번째 거절 테스트를 해보면서 알았다.
아무리 request를 하는 코드를 실행해도 창이 뜨지 않았다.
그 이유는 안드로이드 정책에 따라 사용자가 동일한 권한 요청을 세 번 이상 거부하면, 시스템이 이를 유저의 거절로 인식하고, 사용자가 직접 설정에서 수동으로 권한을 변경하지 않는 한 다시는 요청 창이 뜨지 않도록 되어 있기 때문이다.
https://developer.android.com/training/permissions/requesting?hl=ko
따라서 세번째 거절부터는 Dialog를 띄워 유저가 직접 설정창에서 권한을 설정할 수 있게 해야한다.
유쪽이...
다디얼로그 생성 함수
private void showSettingDialog(String message) {
// AlertDialog 빌더 생성
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setMessage(message)
.setCancelable(false)
.setPositiveButton("확인", (dialog, id) -> {
goToAppSettings();
})
.setNegativeButton("취소", (dialog, id) -> {
dialog.dismiss();
});
// 다이얼로그 생성 및 표시
AlertDialog alert = builder.create();
alert.show();
}
goToAppSettings()
private void goToAppSettings() {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getActivity().getPackageName(), null);
intent.setData(uri);
startActivity(intent);
}
Settings.ACTION_APPLICATION_DETAILS_SETTINGS 이 값을 바꾸면 원하는 설정창으로 이동할 수 있따.
'Android' 카테고리의 다른 글
[Android] 다중언어 설정 (feat. Java) (0) | 2024.11.11 |
---|---|
[Android] SearchView 초성 검색(feat. Java) (0) | 2024.10.29 |
[Android Studio] DB 보기 (1) | 2024.10.18 |
[삽질][Android] 동적 Dialog Fragment 사용하기(feat. Java) (0) | 2024.10.14 |
[삽질][Android] 안드로이드 분할 화면 오류(feat. Kotlin) (0) | 2024.10.07 |