갤러리에서 이미지를 가져오기 위하여
사용자에게 권한을 받아오느라 지치셨나요?? 🤦♂️🤦♂️
자 여기 사용자의 앱 권한 없이 갤러리에 접근하여 이미지를 가져올 수 있는 방법이 있습니다.
😮😮
그것도 이미지 다중 선택까지 지원하면서 말이죠!!!
🔥 Android13 Photo Picker
Photo Picker
권한 동의 없이❗️
갤러리 이미지 선택 ❗️
이미지 다중 선택 ❗️❗️❗️
말로하면 입만 아프죠 바로 확인해봅시다.
위와 같은 갤러리 이미지 호출하는 방법도 아주 간단합니다.
val pickMedia = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
// Callback is invoked after th user selects a media item or closes the photo picker.
if (uri != null) {
Log.d("PhotoPicker", "Selected URI: $uri")
} else {
Log.d("PhotoPicker", "No media selected")
}
}
// Launch the photo picker and allow the user to choose images and videos.
pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageAndVideo))
// Launch the photo picker and allow the user to choose only images.
pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
// Launch the photo picker and allow the user to choose only videos.
pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.VideoOnly))
권한 체크 없이 registerForActivityResult를 사용하여 launch() 메서드로 바로 호출 가능합니다.
launch() 메서드의 파라미터에는 선택할 이미지 또는 비디오에 해당되는 타입 값을 넣어줍니다.
이미지 또는 영상을 선택했다면
uri 값에 값이 들어오게 되고
선택되지 않았다면 null 값으로 받게 됩니다.
어때요 차암 쉽죠 ❓
다음은 이미지 다중 선택입니다.
val pickMultipleMedia = registerForActivityResult(ActivityResultContracts.PickMultipleVisualMedia()) { uris ->
// Callback is invoked after th user selects a media item or closes the photo picker.
if (uris != null) {
Log.d("PhotoPicker", "Selected URI: $uris")
} else {
Log.d("PhotoPicker", "No media selected")
}
}
pickMultipleMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageAndVideo))
사용법은 위와 동일합니다.
다중 선택이기 때문에 uris 값이 [] 리스트 형식으로 들어오게 됩니다.
여기서 한 가지 더 🔥🔥
이미지 다중 선택 기능을 구현하게 되는 경우
다중 선택 최대 개수를 제한하게 되는 경우가 있습니다.
val pickMultipleMedia =
registerForActivityResult(ActivityResultContracts.PickMultipleVisualMedia(3)) { uris ->
// Callback is invoked after th user selects a media item or closes the photo picker.
if (uris != null) {
Log.d("PhotoPicker", "Selected URI: $uris")
} else {
Log.d("PhotoPicker", "No media selected")
}
}
pickMultipleMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageAndVideo))
위의 소스코드와 같이
ActivityResultContracts.PickMultipleVisualMedia(int maxCount)
최대 선택 가능 값을 Int 형식으로 세팅합니다.
최대 선택 가능값을 넘게 이미지 선택을 하게 되면
하단에 SnackBar 형식으로 자동으로 노출되게 됩니다.
이렇게 편리하고 간단하고 유용한 기능이지만
한 가지 문제점이 있습니다 ❓❗️
바로 SDK 버전 체크가 필요하다는 점입니다.
import android.os.ext.SdkExtensions.getExtensionVersion
private fun isPhotoPickerAvailable(): Boolean {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
true
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
getExtensionVersion(Build.VERSION_CODES.R) >= 2
} else {
false
}
}
fun handlePhotoPickerLaunch() {
if (isPhotoPickerAvailable()) {
// To launch the system photo picker, invoke an intent that includes the
// ACTION_PICK_IMAGES action. Consider adding support for the
// EXTRA_PICK_IMAGES_MAX intent extra.
} else {
// Consider implementing fallback functionality so that users can still
// select images and videos.
}
}
targetSDK33 (Android13) 또는 targetSDK32 (Android12) 버전의 일부분만
해당 기능을 지원하고 있습니다.
Photo Picker가 소개된 시점이
Android13이 나오는 순간이기 때문인 것 같네요.
기능적인 부분만 봤을 때는
너무 유용하게 사용될 거 같지만
targetSDK 버전 체크가 필요하다는 부분은
정말 너무 아쉬운 부분입니다.
🤦♂️🤦♂️
Android13 관련하여 이런 게시물은 어떠신가요?? 💁♂️💁♂️💁♂️
여기까지 저의 긴 글을 읽어주셔서 감사합니다.
제가 습관적으로 코딩을 하는 그날까지 습관적으로 코딩을 하기 위해 글 작성을 꾸준하게 해보겠습니다.
'Android > 스터디 노트' 카테고리의 다른 글
[Android] DataBinding 활용하기(1) - @BindingAdapter 매개변수 두개 이상 활용 (0) | 2022.12.19 |
---|---|
Android Deep Link 설정 및 adb 테스트 방법 (0) | 2022.11.18 |
Android 13 Notification Permission 알림 권한 띄우기. (8) | 2022.11.08 |
안드로이드 앱 권한 및 거부 처리 Android Permission Check. (0) | 2022.11.05 |
[Android] Android Debug Mode 잘 활용하기 (안드로이드 스튜디오 디버깅). (2) | 2022.10.12 |
최근댓글