반응형
안드로이드에서 갤러리 이미지, 동영상을 별도 권한 없이 더욱 쉽게 가져올 수 있도록
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를 호출해줍니다.
반응형
'안드로이드' 카테고리의 다른 글
[안드로이드/Android] WebRTC PeerConnection.IceServer() is deprecated. (0) | 2023.02.13 |
---|---|
[안드로이드/Android] local.properties 활용하기/변수저장하기 (0) | 2023.02.10 |
[Android/안드로이드] Flow colect 취소하기/cancellable Flow (0) | 2023.01.26 |
[Android Compose] Circle Image 만들기 (1) | 2023.01.09 |
"./il2cpp.exe'' finished with non-zero exit value 126 in mac (1) | 2022.11.03 |