기기 내 갤러리 앱에서 이미지를 불러오는 방법을 알아보자.
Intent를 사용하여 불러온 이미지를 ImageView에 띄워본다.
※ API LEVEL 33 ↑ 기준으로 포스팅한다.
✅ Manifest 파일에 권한 추가
갤러리에 접근해야 하기 때문에 권한을 추가해주자.
AndroidManifest.xml
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
✅ Permission 요청 세팅
갤러리에 접근하기 전에, Manifest에 추가해줬던 권한을 사용자에게 요청해준다.
TedPermission 라이브러리를 활용하여 간편하게 권한을 요청해주자.
private fun checkPermission() {
TedPermission.create()
.setPermissionListener(object : PermissionListener {
override fun onPermissionGranted() {
selectImage()
}
override fun onPermissionDenied(deniedPermissions: List<String>) {
Log.d(TAG, "onPermissionDenied: 권한 거부됨")
}
})
.setDeniedMessage("권한을 허용해 주셔야\n사용 가능합니다.")
.setPermissions(android.Manifest.permission.READ_MEDIA_IMAGES)
.check()
}
selectImage() 함수에 갤러리에 접근하는 코드를 작성할 것이다.
✅ 갤러리에서 이미지 불러오기
Intent를 사용하여 간편하게 갤러리에서 이미지를 불러올 수 있다.
class Activity: AppCompatActivity() {
lateinit var launcher: ActivityResultLauncher<Intent>
...
override fun onCreate() {
launcher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (it.resultCode == RESULT_OK) {
bind.imageview.setImageURI(it.data?.data)
}
}
}
fun selectImage() {
launcher.launch(Intent().apply {
type = "image/*"
action = Intent.ACTION_PICK
})
}
...
}
Intent의 type, action을 위와 같이 지정해주고,
전역 변수로 선언한 ActivityResultLauncher.launch() 함수의 파라미터로 넘겨준다.
그리고 onCreate() 에서 launcher 초기화 하는 부분을 보자.
it은 ActivityResult를 의미한다.
갤러리에서 이미지를 골랐다면 RESULT_OK 반환되고,
뒤로가기를 눌러서 Intent를 취소하면 resultCode는 RESULT_CANCELED 반환되므로,
조건문을 통해 예외처리를 해주었다.
ActivityResult.data?.data는 URI 형식의 데이터이므로
ImageView.setImageURI() 함수의 파라미터로 URI를 작성해주자.
✅ 결과
● 기본 UI
이미지를 띄울 ImageView와 갤러리로 이동하기 위한 Button만 세팅했다.
● 권한 요청되는 모습
버튼을 누르면 TedPermission으로 권한이 요청된 모습이다.
● 갤러리로 이동된 모습
권한을 허용해주면 곧바로 갤러리로 이동된다.
필자 개인 폰이기에 열심히 가려놓았다.
● 이미지 골랐을 때 ImageView에 띄워진 모습
이미지를 선택하면 자동으로 갤러리에서 본 앱으로 이동된다.
ImageView.setImageURI() 함수로 이미지를 띄운 모습이다.
맛있는 초밥이 나타났다:)
✅ 번외
Intent의 action을 ACTION_PICK 이 아닌,
ACTION_GET_CONTENT 로 지정하면
위와 같이 바텀 시트 형식의 UI가 등장한다.
상황에 따라 마음에 드는 action을 사용하면 된다.
갤러리에 접근해서 이미지를 가져오는 방법을 알아보았다.
약 2년전에 처음 공부 했던 내용이지만, 지금 봐도 어려운 내용은 전혀 없고
Intent를 다양하게 사용할 수 있다는 것을 인지하는 것이 더 큰 공부였다고 생각한다.