먼저 SDK가 Android 14 또는 이상이면 READ_MEDIA_VISUAL_USER_SELECTED 를 AndroidManifiest.xml에 추가해야 합니다.
https://developer.android.com/about/versions/14/changes/partial-photo-video-access
런타임 퍼미션도 OS에 맞게 요청해 주시고요.
// Register ActivityResult handler
val requestPermissions = registerForActivityResult(RequestMultiplePermissions()) { results ->
// Handle permission requests results
// See the permission example in the Android platform samples: https://github.com/android/platform-samples
}
// Permission request logic
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
requestPermissions.launch(arrayOf(READ_MEDIA_IMAGES, READ_MEDIA_VIDEO, READ_MEDIA_VISUAL_USER_SELECTED))
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
requestPermissions.launch(arrayOf(READ_MEDIA_IMAGES, READ_MEDIA_VIDEO))
} else {
requestPermissions.launch(arrayOf(READ_EXTERNAL_STORAGE))
}
안드로이드 14의 경우는 READ_MEDIA_VISUAL_USER_SELECTED 를 핸들링해주셔야 한다고 되어 있습니다.
퍼미션 체크는 아래의 로직을 통해 하라고 되어 있습니다.
if (
Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
(
ContextCompat.checkSelfPermission(context, READ_MEDIA_IMAGES) == PERMISSION_GRANTED ||
ContextCompat.checkSelfPermission(context, READ_MEDIA_VIDEO) == PERMISSION_GRANTED
)
) {
// Full access on Android 13 (API level 33) or higher
} else if (
Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE &&
ContextCompat.checkSelfPermission(context, READ_MEDIA_VISUAL_USER_SELECTED) == PERMISSION_GRANTED
) {
// Partial access on Android 14 (API level 34) or higher
} else if (ContextCompat.checkSelfPermission(context, READ_EXTERNAL_STORAGE) == PERMISSION_GRANTED) {
// Full access up to Android 12 (API level 32)
} else {
// Access denied
}
콜백에서도 적절하게 처리를 해주셔야 합니다.
기존 로직에서 퍼미션이 거절일 때 shouldShowRequestPermissionRationale를 처리하지 마시고 아래 순서로 하세요.
퍼미션 승인 상태 -> 통과
shouldShowRequestPermissionRationale -> 사용자에게 퍼미션이 왜 필요한지 설명
그외 -> 퍼미션 요청 (이 경우는 콜백에서만 처리가 가능하나 모든 경우는 처리되지 않음)
퍼미션 거절은 최초의 상태에서도 나오기 때문에 거절 상태인지 아닌지를 체크하시면 안됩니다. 콜백에서 승인이나 shouldShowRequestPermissionRationale 가 아닌 경우가 나오면 시스템 설정으로 갈 수 있도록 UI를 처리하는 것이 사용자에게 필요할 수 있습니다.
안드로이드 퍼미션 디자인은 기본적으로 문제점이 많은 기능입니다. 테스트를 다양하게 해보고 처리하시는게 제일 좋습니다.