반응형
Gradle 업데이트로 인해 업데이트가 중단된 이미지 선택 라이브러리를 제거하면서
구글에서 제공하는 Photo Picker를 선택했습니다.
서드파티에 의존하는 경우 구현 자체는 편하지만 커스텀 하기 복잡하고
빠르게 바뀌는 구글 정책에 맞게 업데이트 되지 않으면
언젠간 제거 해야해 당장 해야할 업무에 지장이 있을수 있습니다.
Photo Picker
앱에서 디바이스 내부 저장소 접근에 대한 우려섞인 목소리에 Android 13에 소개된 미디어 선택 도구입니다.
단일 선택
private var photoSelectResult = registerForActivityResult(ActivityResultContracts.PickVisualMedia()){ uri ->
if(uri != null){
// 선택한 이미지가 있을때
}else{
// 선택한 이미지가 없을때
}
}
...
photoSelectResult.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
미디어 선택 타입 3가지 입니다.
- ImageOnly
- VideoOnly
- ImageAndVideo
복수 선택
private var photoMultiSelectResult = registerForActivityResult(ActivityResultContracts.PickMultipleVisualMedia(MAX_COUNT)){ uris ->
if(uris != null && uris.isNotEmpty()){
// 사진 있는 경우
}else{
// 사진 없는 경우
}
}
...
photoMultiSelectResult.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
사진 선택시 MAX 값 동적 변경
사진 업로드시 선택한 사진들을 추가/삭제하고 한번에 서버에 업로드 하는 방식을 사용할 경우
picker 실행시 인텐트를 생성하는 방식으로 해야 합니다.
예로 10장 제한일 경우 첫번째 Photo Picker 에서 1장의 사진을 선택하고 두번째 Photo Picker를 열었을 경우 최대 9장만 선택 할 수 있어야 합니다.
private var photoSelectResult = registerForActivityResult(ActivityResultContracts.PickVisualMedia()){ uri -> }
private var photoMultiSelectResult = registerForActivityResult(ActivityResultContracts.PickMultipleVisualMedia(MAX_REVIEW_PHOTO)){ uris -> }
private var photoSelectRealResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
it.data?.clipData?.let{ clipData ->
for(i in 0 until clipData.itemCount){
val data = clipData.getItemAt(i)
addImageUri(data.uri)
}
}
}
.....
val intent = if(remainSelectCount > 1 ) photoMultiSelectResult.contract.createIntent(this, PickVisualMediaRequest.Builder().setMediaType(ActivityResultContracts.PickVisualMedia.ImageOnly).build()).apply { intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, remainSelectCount)}
else photoSelectResult.contract.createIntent(this, PickVisualMediaRequest.Builder().setMediaType(ActivityResultContracts.PickVisualMedia.ImageOnly).build())
photoSelectRealResult.launch(intent)
※Android 30 미만의 경우
이미지 단일 선택만 가능합니다.
서버 업로드
아래 코드를 참고하여 서비스 로직에 맞게 변경하면 됩니다.
private fun addImageUri(uri: Uri){
val cursor: Cursor? = contentResolver.query(
uri, null, null, null, null, null)
cursor?.use {
if (it.moveToFirst()) {
// path = 실제 이미지 경로로 서버 업로드시 사용
val path: String = it.getString(it.getColumnIndex(MediaStore.MediaColumns.DATA) ?: 0)
}
}
}
안드로이드 버전 업데이트시 발 빠르게 대응 하는걸 추천 드립니다.
반응형
'안드로이드 > 팁' 카테고리의 다른 글
[Android] DUNS 번호 인증 관련 문제 대응기 (2) | 2024.12.24 |
---|---|
[Android] Recyclerview 클릭한 아이템 화면 중앙으로 이동 (0) | 2024.11.13 |
[Android] Kotlin DSL 적용기 (0) | 2024.01.31 |
[Android] ScrollView in Recyclerview ( 이중 스크롤 구현 ) (1) | 2023.12.26 |
[Android] 구글 로그인 연동 (2) | 2023.11.13 |