개발/안드로이드 개발
안드로이드 권한 요청 구현하고 예외 처리 하기
룬아님
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에서'거절'을 눌렀을 때
}
}
}
}
}
반응형