일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 생명주기
- searchview
- viewholder
- 리사이클러뷰
- 안드로이드스튜디오
- IntentTestRule
- 안드로이드
- LayoutManger
- 안드로이드개발레벨업교과서
- Android
- 안드로이드13
- 구분선
- Fragment 수동 추가
- 테마 아이콘
- 재사용
- 고차함수
- espresso
- 코딜리티
- ActivityTestRule
- 코틀린
- binding adapter
- 뷰변경 감지
- adapter
- Error:Execution failed for task ':app:mergeDebugResources'
- fragment
- recyclerview
- Fragment에서 Activity의 함수 사용하기
- ui test
- 스와이프
- high order function
Archives
- Today
- Total
룬아님의 취중코딩
안드로이드 권한 요청 구현하고 예외 처리 하기 본문
앱을 개발할 때에 외부 저장소 접근, 전화부 접근 등 다양한 권한을 요청해야하며 권한 요청을 거절하거나 다시 보지 않기를 누르고 거절하는 경우도 예외처리를 해주어야 완성도 있는 앱을 만들 수 있다.
이번에는 간단한 로직으로 권한을 요청하고 예외 처리 하는 법에 대하여 간단하게 적어본다.
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에서'거절'을 눌렀을 때
}
}
}
}
}
반응형
'개발 > 안드로이드 개발' 카테고리의 다른 글
GitHub API를 사용하는 기본적인 Retrofit과 Koin 조합 (0) | 2019.10.31 |
---|---|
(Databinding) databinding으로 2개의 문자열을 같이 사용하는 법 (0) | 2019.10.30 |
SearchView and Databinding with high order function (0) | 2019.10.28 |
(레포지토리 패턴) local과 remote 중 하나에서만 작동하는 기능이 필요할 때 (0) | 2019.10.28 |
(Koin) BroadcastReceiver에서 inject()를 사용할 수 없는 문제 (0) | 2019.10.24 |
Comments