Android

[삽질] [Android] Permissions 권한 거절 (feat. Java)

김한토 2024. 10. 21. 17:43
반응형
SMALL

오늘 주로 다룰 권한은 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

 

 

런타임 권한 요청  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 런타임 권한 요청 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 모든 Android 앱은 액세스가 제한된 샌

developer.android.com

 

따라서 세번째 거절부터는 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 이 값을 바꾸면 원하는 설정창으로 이동할 수 있따. 

 

반응형
LIST