💡 지금까지 한 장의 사진만 선택해서 넘기는 작업을 주로 했었는데, 여러 장을 하는 것은 처음이라 작성해봅니다.
먼저 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를 불러오는 로직은 다음과 같습니다.
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를 통해 구분해주게 됩니다.
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에 넣어주는 작업을 해주었습니다.
코드 전문을 보고싶으신 분들은 기다려주세요 개발이 끝나는 데로 깃허브 링크를 올려드리겠습니다!
긴 글 읽어주셔서 감사합니다~