갤러리에서 이미지를 가져오기 위하여

사용자에게 권한을 받아오느라 지치셨나요??  🤦‍♂️🤦‍♂️

 

자 여기 사용자의 앱 권한 없이 갤러리에 접근하여 이미지를 가져올 수 있는 방법이 있습니다.

😮😮

그것도 이미지 다중 선택까지 지원하면서 말이죠!!!

 

 

🔥 Android13 Photo Picker

 

 

 

사진 선택 도구  |  Android 개발자  |  Android Developers

사진 선택 도구 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 그림 1. 앱에 사진을 공유할 수 있는 직관적인 UI를 제공하는 사진 선택 도구 사진 선택 도구

developer.android.com

 

 


 

Photo Picker

 

권한 동의 없이❗️

갤러리 이미지 선택 ❗️

이미지 다중 선택 ❗️❗️❗️

말로하면 입만 아프죠 바로 확인해봅시다.

 

 

 

출처 https://developer.android.com/training/data-storage/shared/photopicker

 

 

 

 

위와 같은 갤러리 이미지 호출하는 방법도 아주 간단합니다.

 

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 13 Notification Permission 알림 권한 띄우기

드디어 Android13 업데이트가 다가왔습니다. 이미 Google pixel 기종들은 업데이트가 가능하고 삼성 기기들은 S22 기종들부터 업데이트가 이미 가능하며 22.11부터 점진적으로 업데이트 일정이 나온다

salmonpack.tistory.com

 

Android13(SDK33) 이미지 및 사진 권한 (READ_EXTERNAL_STORAGE, READ_MEDIA_IMAGES)

프로젝트의 SDK Target을 33으로 변경하게 되면 기존 이미지 및 사진 권한이 갑자기 사라지는 현상을 마주하게 됩니다. (저는 항상 프로젝트 SDK Target 버전을 변경할 때마다 두렵습니다... 오늘은 또

salmonpack.tistory.com

 


여기까지 저의 긴 글을 읽어주셔서 감사합니다.

제가 습관적으로 코딩을 하는 그날까지 습관적으로 코딩을 하기 위해 글 작성을 꾸준하게 해보겠습니다.

 

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기