개발 공부/안드로이드
android 권한 요청
yong_DD
2022. 7. 3. 15:32
권한을 요청할 때 라이브러리만 사용을 했었는데, 제공하는 것만으로도 간단하게 요청할 수 있다.
안드로이드에서 말하는 권한 워크플로는 아래와 같다.

권한 확인 여부 → (권한 없을시) 권한 요청 →
(권한 거부시) 권한이 왜 필요한지 설명 → 권한 요청
상단의 플로우를 따라 예시로 내부 저장소 권한을 요청하는 코드를 작성하면 이렇다.
(android develope 예시)
when {
ContextCompat.checkSelfPermission(
this,
android.Manifest.permission.READ_EXTERNAL_STORAGE
) == PackageManager.PERMISSION_GRANTED -> {
// 내부 저장소 접근하는 코드 작성
}
shouldShowRequestPermissionRationale(android.Manifest.permission.READ_EXTERNAL_STORAGE) -> {
// 권한이 왜 필요한지 요청하는 코드 작성
}
else -> {
// 한 개만 요청
requestPermissionLauncher.launch(
android.Manifest.permission.READ_EXTERNAL_STORAGE)
//여러개 요청시
requestPermissions(CONTEXT,
arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE
,android.Manifest.permission.WRITE_EXTERNAL_STORAGE),
111)
}
}
// 한 개만 요청 응답
val requestPermissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestPermission()
) { isGranted: Boolean ->
if (isGranted) {
// 내부 저장소 접근하는 코드 작성
} else {
// 권한 거절
}
}
// 여러개 요청 응답
override fun onRequestPermissionsResult(requestCode: Int,
permissions: Array<String>, grantResults: IntArray) {
when (requestCode) {
111 -> {
if ((grantResults.isNotEmpty() &&
grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
// 첫 번째 권한 요청 승인
} else {
// 나머지 필요 부분 작성
}
return
}
else -> {
// 요청 코드가 아니라서 무시
}
}
}
1. ContextCompat.checkSelfPermission
매개변수로 받은 권한이 거부된 상태인지 승인된 상태인지 반환
(PackageManager.PERMISSION_DENIED, PackageManager.PERMISSION_GRANTED)
2. shouldShowRequestPermissionRationale()
권한의 필요성을 설명할 UI를 띄워야하는 경우인지를 반환
(권한을 거부한 경우 true, 권한을 허용하거나 거부한 적이 없는 경우-요청이 처음인 경우 false)
3. requestPermissions()
권한 요청을 화면을 띄우고 선택한 값을 onRequestPermissionsResult이나
registerForActivityResult(ActivityResultContracts.RequestPermission())에 보냄

requstPermission을 요청하면 나오는 화면