https://chanho-study.tistory.com/48
이전 글에서 안드로이드 RunTime Permission에 대해 알아 봤으니 이제 프로젝트에 적용해 보겠습니다.
가장 먼저 갤러리에 접근하기 위한 권한을 선언해 줍니다!!
AndoridManifest.xml
<!--갤러리 관련 권한 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
외부 저장소에 대한 읽기와 쓰기 권한을 요청하기 위한 상수 배열을 정의 해줍니다.
class Constants {
companion object{
val REQUEST_STORAGE_PERMISSIONS = arrayOf(
android.Manifest.permission.READ_EXTERNAL_STORAGE,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
)
}
}
권한 요청을 위한 launcher를 선언해 주었습니다. shouldShowRequestPermissionRationale(permission)로 사용자가 권한을 거부하고 "다시 묻지 않음" 체크박스를 체크했을 때 snakBar를 통해 사용자에게 왜 권한이 필요한지 보여줍니다. snackBar에는 권한이 거부된 경우 Snackbar를 통해 메시지를 표시하고, "확인" 액션을 누르면 애플리케이션의 설정 화면으로 이동합니다.
private val launcherForPermission = registerForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()
){ permissions ->
if (permissions.all { it.value }) {
accessGallery()
} else {
// 하나 이상의 권한이 거부된 경우 처리할 작업
permissions.forEach { (permission, isGranted) ->
when {
!isGranted -> {
// 사용자가 이전에 해당 권한을 거부하고, "다시 묻지 않음"을 선택한 경우에 false를 반환
if(!shouldShowRequestPermissionRationale(permission)){
// 사용자에게 왜 권한이 필요한지 설명하는 다이얼로그 또는 메시지를 표시
showPermissionSnackBar()
}
}
else -> {
// 사용자가 "다시 묻지 않음"을 선택한 경우 처리할 작업
showPermissionSnackBar()
}
}
}
}
}
private fun showPermissionSnackBar() {
Snackbar.make(binding.root, "권한이 거부 되었습니다. 설정(앱 정보)에서 권한을 확인해 주세요.",
Snackbar.LENGTH_INDEFINITE
).setAction("확인"){
//설정 화면으로 이동
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
val packageName = requireActivity().packageName
Log.d("MyPackageName", packageName)
val uri = Uri.fromParts("package", packageName, null)
intent.data = uri
startActivity(intent)
}.show()
}
이제 사용자가 버튼을 클릭하면 isAllPermissionGranted() 함수를 통해 상수로 정의한 권한이 모두 허용되었으면 True 반환합니다. 허용되지 않은 권한있다면 권한을 요청하고 권한이 허용됐다면 갤러리를 열고 거부했을 경우 위에서 선언해준 launcher에 필요한 권한을 요청합니다.
imgLoadButton.setOnClickListener {
if (isAllPermissionsGranted()) accessGallery()
else launcherForPermission.launch(REQUEST_STORAGE_PERMISSIONS)
}
private fun isAllPermissionsGranted(): Boolean = REQUEST_STORAGE_PERMISSIONS.all { permission->
ContextCompat.checkSelfPermission(requireContext(), permission)
== PackageManager.PERMISSION_GRANTED
}
실행 화면
'Android' 카테고리의 다른 글
Android Main Thread (2) | 2023.12.23 |
---|---|
Anroid REST API 연동기 [GET] (3) | 2023.12.22 |
Android Runtime Permission (1) | 2023.12.17 |
OkHTTP httpLoggingInterceptor (0) | 2023.12.15 |
Retrofit Network Time out (0) | 2023.12.15 |