개발을 하다 보면 이미지 업로드를 위해 갤러리 사진 선택 기능을 사용하는 경우가 있다.
내가 구현하고자 했던 기능은 이미지를 최대 N장 선택 및 리사이클러뷰에 추가, 이후 서버에 업로드하는 기능이였는데,
Tiramisu 이상에서 추가된 MediaStore.ACTION_PICK_IMAGES의 MediaStore.EXTRA_PICK_IMAGES_MAX라는 Intent extra를 설정하다 문제에 직면했다.
트러블
val maxPhotoCount = MAX_PHOTO_COUNT - currPhotoCount
val intent = Intent(MediaStore.ACTION_PICK_IMAGES).apply {
putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, maxNumPhotos)
type = "image/*"
}
1. 최대 선택 가능한 이미지가 5개이다.
2. 현재 선택한 이미지가 4개이다.
3. 이미지 추가 버튼을 눌러도 갤러리로 진입하지 않는다.
그래서 리사이클러뷰의 생성자 파라미터인 담당 뷰모델의 flow도 찍어보고, 프래그먼트의 currPhotoCount도 전부 찍어봤지만 전부 정상이였다.
공식문서
1. EXTRA_PICK_IMAGES_MAX는 1보다 큰 양의 정수만 받을 수 있다.
2. 내가 사용했던 maxPhotoCount 가 1이 되면 Activity#RESULT_CANCELED가 호출되어 인텐트를 날림에도 갤러리에 진입하지 못했던 것이다.
트러블슈팅
코드를 더 최적화할 수 있으나, API레벨에 따른 구분을 직관적으로 하기 위하여 수정하지 않았습니다.
val maxNumPhotos = MAX_PHOTO_COUNT - currPhotoCount
val intent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
Intent(Intent.ACTION_GET_CONTENT).apply {
type = "image/*"
if (maxNumPhotos != 1) {
putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, maxNumPhotos)
}
}
} else {
Intent(Intent.ACTION_GET_CONTENT).apply {
type = "image/*"
putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
}
}
photoLauncher.launch(intent)
API Level 33 이상
1. maxPhotoCount가 1이 아니라면 다중 선택 + 선택 개수 제한이 가능한 EXTRA_PICK_IMAGES_MAX를 호출한다.
2. maxPhotoCount가 1이라면 ACTION_GET_CONTENT로 단일 선택만 가능한 갤러리를 연다.
-> 갤러리에서 사진을 선택할 때 사용자가 명시적으로 N개만 선택할 수 있다는 제한을 걸 수 없어 마음에 들지는 않는다.
-> 하지만 registerForActivityResult API를 사용하여 다중 선택 후에 특정 개수 이상이라면 데이터를 리사이클러뷰에 추가하지 못하도록 설정해줄 수 있다.
API Level 33 미만
1. 선택 개수 제한이 불가능한 EXTRA_ALLOW_MULTIPLE을 true로 설정하여 다중 선택이 가능한 갤러리를 연다.
2. 위와 동일하게 registerForActivityResult로 개수를 제한해야 한다.
매일 여러 문제에 직면하고 그걸 해결할 때마다 느끼는 거지만, 여러 정보글들을 찾아보기 전에
제일 먼저 공식 문서를 꼼꼼하게 읽는 습관을 들이는 것이 가장 중요한 것 같다.
'개발 > Android' 카테고리의 다른 글
[안드로이드] Gson에서 Moshi로 마이그레이션하기 (0) | 2024.12.30 |
---|---|
[안드로이드] RecyclerView는 어떻게 동작할까? (0) | 2024.06.24 |
[안드로이드] 클린 아키텍처 - (3) 멀티 모듈 패키지 구조 (0) | 2023.05.23 |
[안드로이드] 클린 아키텍처 - (2) 의존성 역전 (0) | 2023.05.16 |
[안드로이드] 클린 아키텍처 - (1) 개념 (0) | 2023.05.16 |