Permission Check / Request

sumi Yoo·2024년 10월 3일
  1. 갤러리에 있는 사진에 접근하기 위해 권한을 체크하고 요청하려고 한다. 컴포즈에서 권한은 어떻게 체크하고 요청할까?

  2. AndroidManifest.xml 에 요청할 권한을 추가해준다.
    SDK version 33부터는 READ_MEDIA_IMAGES 으로 써줘야 한다.
    단말이 버전 34인데, READ_EXTERNAL_STORAGE 권한으로 요청하니까 권한 요청 팝업이 뜨지 않았다.
    (참고) Android API Levels 확인 > https://apilevels.com

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
        android:maxSdkVersion="32" />
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
  1. 권한 요청하기 전에 권한이 있는지 체크한다. SDK version 별로 권한 종류를 분기처리 해줬다.
    이미 있다면 콜백으로 true 를 넘겨 갤러리 피커가 열리게 했고, 없다면 권한 요청 팝업을 띄운다.
fun checkPermission(
    context: Context,
    launcher: ManagedActivityResultLauncher<Array<String>, Map<String, Boolean>>,
    result: (Boolean) -> Unit
) {
    val permissions = if (Build.VERSION.SDK_INT >= 33) {
        arrayOf( Manifest.permission.READ_MEDIA_IMAGES)
    } else {
        arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE)
    }

    if (permissions.all {
            ContextCompat.checkSelfPermission(
                context,
                it
            ) == PackageManager.PERMISSION_GRANTED
    }) {
        result(true)
    }

    else {
        result(false)
        launcher.launch(permissions)
    }
}
  1. rememberLauncherForActivityResult() 로 권한을 거부했는지, 허용했는지 결과를 받아낸다. 허용이면 갤러리 피커 실행, 거부면 스낵바로 안내 메시지를 띄웠다.
    // check permission
    val context = LocalContext.current
    val launcherMultiplePermissions = rememberLauncherForActivityResult(
        ActivityResultContracts.RequestMultiplePermissions()
    ) { permissionsMap ->
        val areGranted = permissionsMap.values.reduce { acc, next -> acc && next }
        if (areGranted) {
            galleryLauncher.launch(
                PickVisualMediaRequest(
                    ActivityResultContracts.PickVisualMedia.ImageOnly
                )
            )
        } else {
            scope.launch {
                snackbarHostState.showSnackbar(message = context.getString(R.string.msg_permission_photo))
            }
        }
    }
  1. 스낵바 띄우는 방법은 아래 포스팅에 정리해두었다.
    https://velog.io/@hugbee/Snackbar-%EB%9D%84%EC%9A%B0%EA%B8%B0

https://tg-world.tistory.com/8

0개의 댓글