[Kotlin] 이미지 여러장 선택해서 넘기기

Hand·2022년 10월 1일
0

Android

목록 보기
12/17

💡 지금까지 한 장의 사진만 선택해서 넘기는 작업을 주로 했었는데, 여러 장을 하는 것은 처음이라 작성해봅니다.

권한 설정

먼저 AndroidManifest.xml에서 권한을 설정해주는 것이 필요합니다.
<Android.Manifext.xml>

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="?????">

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <application

이렇게 설정하면, 읽기 권한에 대해서 사용할 것이라는 것을 뜻합니다.

로직

image를 불러오는 로직은 다음과 같습니다.

  1. 사진을 추가해주기 위해서 버튼 클릭
  2. 권한이 있는지 확인
  3. (권한이 있다면) 갤러리를 열어줌
  4. 갤러리에서 이미지 선택
  5. onActivityResult()에서 선택한 이미지들의 처리

권한이 있는지 확인

val readPermission = ActivityCompat.checkSelfPermission(
	this,
	android.Manifest.permission.READ_EXTERNAL_STORAGE
)

if (readPermission == PackageManager.PERMISSION_DENIED) {
	ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), REQ_STORAGE_PERMISSION)
} else {
	openGallery()
}

readPermission에 대해서 PERMISSION_DENIED가 되어있는지 확인하고,
없다면 새로 요청을 하고, 있다면 원하는 작업을 실행하시면 됩니다.
여기서 우리는 Gallery를 열어주는 작업을 할 것입니다.

권한을 요청하는 코드에서 마지막에 READ_EXTERNAL_STORAGE가 보이실 겁니다.
이는 requestCode로 아무 상수나 지정해주시면 됩니다.
지금은 필요없지만, 또 다른 requestCode를 사용하는 갤러리를 열어주는 작업에서 설명하겠습니다.

갤러리 열기

private fun openGallery() {
	val intent = Intent(Intent.ACTION_PICK)
	intent.data = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
	intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
	intent.action = Intent.ACTION_GET_CONTENT
	
    startActivityForResult(intent, OPEN_GALLERY)
}

위에서부터 쉽게 설명하자면,
intent를 통해서 뭘 열까? -> ACTION_PICK (Gallery)
data type은 뭐야? -> URI
여러 개 선택할 거? -> 응
어떤거 할꺼? -> 콘텐츠 가져올거야

인텐트 시작!!
의 의미인 것 같습니다.
이렇게 하면 Gallery가 열리고 이미지를 선택하실 수 있게됩니다.

startActivityForResult(intent, OPEN_GALLERY) 를 보시면
OPEN_GALLERY가 뭐야? 난 빨간줄만 뜨는데 하시는 분들도 계실텐데
이는 requestCode로 위에서 언급한 내용입니다.

requestCode는 상수로 지정할 수 있는데, 한 Activity에서 여러개의 작업을 했다고 쳤을 때, 작업 후에 데이터를 처리하는 곳은 onActivityResult() 입니다.

onActivityResult()에서 어떤 작업을 처리해야하는 거야?? 를 구분해주기 위해서 requestCode를 통해 구분해주게 됩니다.

onActivityResult() 에서 선택한 이미지들 처리

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
	super.onActivityResult(requestCode, resultCode, data)

	if (resultCode == RESULT_OK && requestCode == OPEN_GALLERY) {
		if (data?.clipData != null) {
			val count = data?.clipData!!.itemCount

			if (count > 10) {
				Toast.makeText(applicationContext, "사진은 최대 10장까지 선택 가능합니다.", Toast.LENGTH_LONG).show()
				return
			}

			for (i in 0 until count) {
				val imageUri = data.clipData!!.getItemAt(i).uri
				images.add(imageUri)
			}
		} else {
			data?.data?.let { uri ->
			val imageUri: Uri? = data?.data
		
	        if (imageUri != null) {
				images.add(imageUri)
			}
		}
	}

	setAdapter()
	}
}

위에서 requestCode == OPEN_GALLERY 로 갤러리를 오픈하고 난 다음의 데이터를 처리하는 과정입니다.

images는 그냥 ArrayOf() 입니다.
데이터를 images에 넣어주고, 넣은 이미지들을 setAdapter()에서 recyclerView에 넣어주는 작업을 해주었습니다.

코드 전문을 보고싶으신 분들은 기다려주세요 개발이 끝나는 데로 깃허브 링크를 올려드리겠습니다!

긴 글 읽어주셔서 감사합니다~

profile
화이팅!

0개의 댓글