[Android / Kotlin] Android 13 (SDK 33)에서 이미지 및 사진 권한

Subeen·2024년 1월 22일
0

Android

목록 보기
45/71

TatgetSdk = 34 인 상태에서 갤러리에서 가져온 이미지를 이미지뷰에 세팅 하려고 하니 이미지가 안 보이는 현상이 발생했다. 발생하던 에러를 해결했음에도 불구하고 여전히 이미지가 표시가 안되어서 찾아보니 Sdk 버전에 따른 권한 문제였다 ! 이번 팀과제는 유독 권한이 말썽이었던 것 같다 😭 Sdk 버전에 따라 사용자에게 권한을 요청하는 부분을 수정하였는데, 이 부분을 정리해보겠다.

Target SDK를 33 이상으로 변경하게 된다면 기존 READ_EXTERNAL_STORAGE 권한에 대한 세분화가 진행된다.
기존에 READ_EXTERNAL_STORAGE 권한만 적용되어 있다면, TargetSDK 33 부터는 필요에 따라 READ_MEDIA_IMAGES, READ_MEDIA_VIDEO, READ_MEDIA_AUDIO에 대한 권한들을 Manifest에 선언해 주고 해당 이름의 권한으로 권한 요청을 진행해야 한다.

AndroidManifest.xml

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

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

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

    <application
    ...

MainActivity.kt


    companion object {
        private const val callPermission = android.Manifest.permission.CALL_PHONE
        private const val mediaPermission = android.Manifest.permission.READ_EXTERNAL_STORAGE
        private const val imagePermission = android.Manifest.permission.READ_MEDIA_IMAGES
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
			requestTiramisuPermission()
		} else {
			requestCallAndStoragePermission()
		}
        
    }

    private fun checkPermissionsAndStartMotion(permissions: Array<String>, requestCode: Int) {
        val permissionResults = permissions.map {
            ContextCompat.checkSelfPermission(this, it) == PackageManager.PERMISSION_GRANTED
        }

        if (permissionResults.all { it }) {
			// TODO 권한이 허용 되었을 때의 액선 
        } else {
            ActivityCompat.requestPermissions(this, permissions, requestCode)
        }
    }

	// Android 13 미만일 때 
    private fun requestCallAndStoragePermission() {
        checkPermissionsAndStartMotion(arrayOf(callPermission, mediaPermission), 100)
    }

	// Android 13 이상일 때 
    private fun requestTiramisuPermission() {
        checkPermissionsAndStartMotion(arrayOf(callPermission, imagePermission), 200)
    }
    
    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {

        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        when (requestCode) {
            100, 200 -> {
                if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // TODO 권한이 허용 되었을 때의 액션 
                } else {
                    finish()
                }
            }
        }
    }    

참조
Android13(SDK33) 이미지 및 사진 권한 (READ_EXTERNAL_STORAGE, READ_MEDIA_IMAGES)
출처: https://salmonpack.tistory.com/46 [습관성 코딩:티스토리]

profile
개발 공부 기록 🌱

0개의 댓글