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에 선언해 주고 해당 이름의 권한으로 권한 요청을 진행해야 한다.
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
...
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()
}
}
}
}