하루에 0.01%라도 성장하자

Develop/Android

Android Image Multi Select in Gallery 갤러리에서 사진 여러개 선택

뚠님 2022. 7. 20. 11:27
반응형

안드로이드 앱을 사용하다 보면 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로 값이 들어온다.

 

이부분을 확인하여 분기처리하면 정상적으로 사용할 수 있다 . :)

 

반응형
1 2 3 4 5 6 7 8 ··· 61