Kwaang Tech

[Android] Android 13(SDK 33) 이미지 권한 부여 본문

Dev/Study

[Android] Android 13(SDK 33) 이미지 권한 부여

콰앙 2024. 12. 9. 20:54

TatgetSdk = 34인 상태에서 갤러리에서 가져온 이미지를 사용 하려고 하니 권한이 거부 되는 현상이 발생했다. 

Target SDK를 33 이상으로 변경하게 된다면 기존 READ_EXTERNAL_STORAGE 권한에 대한 세분화가 진행 된다.
기존에 READ_EXTERNAL_STORAGE 권한만 적용되어 있다면, TargetSDK 33부터는 필요에 따라

READ_MEDIA_IMAGES, READ_MEDIA_VIDEO, READ_MEDIA_AUDIO 에 대한 권한들을 Manifest에 선언해 주고 해당 이름의 권한으로 권한 요청을 진행해야 한다.

 

Storage 권한 세분화

 

 

AndroidManifest.xml

Android 13 이상 에서 사용할 READ_MEDIA_IMAGES  미만에서 사용 READ_EXTERNAL_STORAGE 권한을 선언해준다.

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />

 

MainActivity.kt

private val requestPermission: ActivityResultLauncher<Array<String>> =
        registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
            permissions.entries.forEach {
                val perMissionName = it.key
                val isGranted = it.value
                //권환 부여시 Toast 표시 후 실행
                if (isGranted) {
                    Toast.makeText(
                        this@MainActivity,
                        "권한 부여",
                        Toast.LENGTH_LONG
                    ).show()

                    val pickIntent =
                        Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
                    openGalleryLauncher.launch(pickIntent)
                } else {

                    if (perMissionName == Manifest.permission.READ_EXTERNAL_STORAGE)
                        Toast.makeText(
                            this@MainActivity,
                            "권한 거부",
                            Toast.LENGTH_LONG
                        ).show()
                }
       }

}

private fun requestStoragePermission() {
        val permissions = when {
            Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU -> {
                // Android 33 이상
                arrayOf(Manifest.permission.READ_MEDIA_IMAGES)
            }
            Build.VERSION.SDK_INT >= Build.VERSION_CODES.M -> {
                // Android 23 ~ Android 32
                arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE)
            }
            else -> {
                // Android 22 이하 (권한 요청 필요 없음)
                return
            }
        }

        requestPermission.launch(permissions)
}
반응형