반응형
안드로이드 앱을 사용하다 보면 intent를 이용해서 사진을 가져오는 경우가 많다.
사진을 가져올때는 하나만 가져올 수도 있고, 여러 사진을 셀렉트 해서 가져올 수 있다.
Intent.ACTION_GET_CONTENT 를 사용하면 최근 사용한 이미지를 선택 할 수 있다.
이때 갤러리를 들어가지 않고 바로 데이터를 선택할 수 있고, 갤러리에 들어가서 하나만 선택해서 나올 수 있다.
우선 먼저 코드를 볼까
private fun bindingAddImageButton() {
binding.addImageButton.setOnClickListener {
when {
ContextCompat.checkSelfPermission(
this, android.Manifest.permission.READ_EXTERNAL_STORAGE
) == PackageManager.PERMISSION_GRANTED -> {
startContentProvider()
}
shouldShowRequestPermissionRationale(android.Manifest.permission.READ_EXTERNAL_STORAGE) -> {
showPermissionContextPopup()
}
else -> {
requestPermissions(
arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE), 1010
)
}
}
}
}
private fun startContentProvider() {
val intent = Intent(Intent.ACTION_GET_CONTENT).apply {
type = "image/*"
putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
action = Intent.ACTION_GET_CONTENT
}
startActivityForResult(Intent.createChooser(intent, "SELECT PICTURE"), IMAGE_ADD_COMPLETED_CODE)
}
이미지를 올리는 버튼을 누르면 해당 코드가 실행하도록 리스너를 등록해주면 된다.
이후 우리는 이미지를 가져올 것이기 때문에 타입을 image/*로 설정한다.
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode != Activity.RESULT_OK) return
when (requestCode) {
IMAGE_ADD_COMPLETED_CODE -> {
if (data?.clipData != null) {
for (i in 0 until data.clipData!!.itemCount) {
val imageView = createEmptyImageView()
val uri = data.clipData!!.getItemAt(i).uri
imageView.setImageURI(uri)
imageUriList.add(uri)
if (imageView.parent != null) {
(imageView.parent as ViewGroup).removeView(imageView)
}
binding.imageFlexLayout.addView(imageView)
}
} else {
val imageView = createEmptyImageView()
val uri = data?.data
if (uri != null) {
imageView.setImageURI(uri)
imageUriList.add(uri)
binding.imageFlexLayout.addView(imageView)
}
}
}
else -> {
Toast.makeText(this, "사진 못가져옴", Toast.LENGTH_SHORT).show()
}
}
}
이후 정상적으로 가져오면 onActivitiyResult 를 타고, 약속한 코드값으로 분기한다.
이때 갤러리로 가져오면 data.clipData 로 값이 들어오고
최근 이밎로 가져오면 data.data로 값이 들어온다.
이부분을 확인하여 분기처리하면 정상적으로 사용할 수 있다 . :)
반응형
'Develop > Android' 카테고리의 다른 글
FCM Topic 구독 구현하기 (0) | 2022.08.02 |
---|---|
Android API로 STT, TTS 구현하기 (0) | 2022.07.21 |
Room @PrimaryKey autoGenerate (0) | 2022.07.13 |
Kotlin 을 이용한 동적 setBackgroundColor (0) | 2022.07.06 |
Duplicate Class Found in Android (0) | 2022.06.24 |