안드로이드

[안드로이드/Android] Android Photo Picker directions.

알통몬_ 2023. 2. 7. 14:21
반응형

안드로이드에서 갤러리 이미지, 동영상을 별도 권한 없이 더욱 쉽게 가져올 수 있도록

Photo Picker 라는 녀석이 생겼습니다.

API 30 이상에서, androidx.activity 버전 1.6.1이상에서 사용할 수 있습니다.

// 싱글 이미지 또는 비디오 선택
private val pickMedia =
    registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->

        if (uri != null) {
            Log.d("Photo Picker", "Selected URI: $uri")
            selectedImageView.setImageURI(uri)
        } else {
            Log.d("`Photo Picker", "No media selected...")
        }
    }

// 다중 이미지 선택
private val maxItems = 10
private val pickMultipleMedia =
    registerForActivityResult(ActivityResultContracts.PickMultipleVisualMedia(maxItems)) { uris ->
        if (uris.isNotEmpty()) {
            Log.d("Photo Picker", "Number of items selected: ${uris.size}")
        } else {
            Log.d("Photo Picker", "No media selected...")
        }
    }

 

xml에 4개의 버튼을 만들었습니다.

이미지 선택, 비디오 선택, 이미지와 비디오 선택, 이미지 다중 선택 그리고 아래처럼 클릭리스너를 작성했습니다.

다중 이미지의 선택의 경우 pickMedia 대신에 pickMultipleMedia 를 사용해주세요.

override fun onClick(v: View) {
    when (v.id) {
        R.id.imageOnlyBtn -> {
            pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
        }
        R.id.specificImageOnlyBtn -> {
        
    		val mimeType = "image/gif" // 지정한 타입만 보여집니다.
            pickMedia.launch(
                PickVisualMediaRequest(
                    ActivityResultContracts.PickVisualMedia.SingleMimeType(
                        mimeType
                    )
                )
            )
        }
        R.id.videoOnlyBtn -> {
            pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.VideoOnly))
        }
        R.id.imageAndVideoBtn -> {
            pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageAndVideo))
        }
    }
}

링크와 같은 실행 결과를 확인할 수 있습니다.

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

 

특징이 있다면 

PickMultipleVisualMedia

내부적으로

@SuppressLint("ClassVerificationFailure", "NewApi")
@JvmStatic
fun isPhotoPickerAvailable(): Boolean {
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        true
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        // getExtension is seen as part of Android Tiramisu only while the SdkExtensions
        // have been added on Android R
        getExtensionVersion(Build.VERSION_CODES.R) >= 2
    } else {
        false
    }
}

함수를 제공하고 있어서 버전에 맞춰 Intent를 호출해줍니다.

 

반응형