룬아님의 취중코딩

안드로이드 권한 요청 구현하고 예외 처리 하기 본문

개발/안드로이드 개발

안드로이드 권한 요청 구현하고 예외 처리 하기

룬아님 2019. 10. 29. 13:20

앱을 개발할 때에 외부 저장소 접근, 전화부 접근 등 다양한 권한을 요청해야하며 권한 요청을 거절하거나 다시 보지 않기를 누르고 거절하는 경우도 예외처리를 해주어야 완성도 있는 앱을 만들 수 있다.

이번에는 간단한 로직으로 권한을 요청하고 예외 처리 하는 법에 대하여 간단하게 적어본다.

 

1. 변수 선언

private static final int REQUEST_EXTERNAL_STORAGE_PERMISSION = 1111;
  //=> 요청 결과를 받기 위한 Request code
private static final String[] PERMISSIONS_STORAGE = {
        Manifest.permission.READ_EXTERNAL_STORAGE
};

  //=> 요청할 권한의 종류, 배열에 값을 추가하여 다른 권한 요청도 한꺼번에 할 수 있다.

 

2. 권한이 있는지 확인하고 요청하기

private boolean checkExternalStoragePermission() {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M || getActivity().checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
        return true;
    } else {
        requestPermissions(PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE_PERMISSION);
        return false;
    }
}
private void selectImage() {
    if (checkExternalStoragePermission()) {
        //권한이 있을 경우 해야할 일
    }
}

 

3. 요청한 권한의 결과 확인하기

@Override //권한 요청 결과는 onRequestPermissionsResult으로 들어온다.
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if (requestCode == REQUEST_EXTERNAL_STORAGE_PERMISSION) {
    	//권한 요청 dialog에서 '수락'을 눌렀을 때
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            selectImage();
        } else {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            	//권한 요청 dialog에서 다시 묻지 않기를 체크하고 '거절'을 눌렀을 때
                if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_EXTERNAL_STORAGE)) {
                    //다시 묻지 않기를 체크하고 거절을 누르면 권한 요청 dialog를 띄울 수 없게 되기 때문에
                    //사용자가 직접 권한을 허용해주도록 앱 설정 화면으로 보내는 dialog를 만들어 준다.
                    new AlertDialog.Builder(this)
                            .setMessage(R.string.err_required_storage_permission_to_access_image)
                            .setPositiveButton(R.string.setting,
                                    (dialog, which) -> {
                                        try {
                                            Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
                                                    .setData(Uri.parse("package:" + getPackageName()));
                                            startActivity(intent);
                                        } catch (ActivityNotFoundException e) {
                                            e.printStackTrace();

                                            Intent intent = new Intent(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS);
                                            startActivity(intent);
                                        }
                                    })
                            .setNegativeButton(R.string.cancel,
                                    (dialog, which) -> {
                                    })
                            .show();
                } else {
                  //TODO 권한 요청 dialog에서'거절'을 눌렀을 때
                }
            }
        }
    }
}

 

반응형
Comments