[Android] 갤러리에서 이미지 불러오기

deBaeloper08·2022년 10월 16일
0

startActitivyForResult Deprecated

전에는 갤러리에서 이미지를 가져오려면 startActitivyForResult를 사용했지만 Deprecated가 되며 구현 방식이 바뀌게 되었다. 이제는 registerForActivityResult를 활용하여 갤러리에서 이미지를 가져와야 한다.

val imageResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
        result ->
        if(result.resultCode == RESULT_OK) {
            // 이미지를 받음
            val imageUri = result.data?.data
            Glide.with(this)
                .load(imageUri)
                .into(binding.img)
        }
    }

이 때 registerForActivityResult 변수의 초기화 위치가 중요하다. onCreate나 onStart에서 초기화되지 않으면 IllegalStateException을 발생시키기 때문이다.

val intent = Intent(Intent.ACTION_PICK)
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*")
imageResult.launch(intent)

위 코드처럼 Intent 객체를 만들고 registerForActivityResult 변수에서 launch의 인자값으로 전달하여 실행하면 된다.

권한 설정

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

이미지를 불러오기 위해서는 외부 저장소 접근 권한이 필요하여 위 2개의 권한을 설정해야 한다. 필자는 TedPermission을 사용하여 권한을 설정했다.

 implementation 'io.github.ParkSangGwon:tedpermission:2.3.0'

app gradle파일에 해당 코드를 입력한 후 sync now를 한다.

private val permissions = arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE, 
  android.Manifest.permission.READ_EXTERNAL_STORAGE)

위처럼 확인하고자 하는 permission들을 배열에 담는다.

val permissionListener = object : PermissionListener {
            override fun onPermissionGranted() {
                val intent = Intent(Intent.ACTION_PICK)
                intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
  					"image/*")
                imageResult.launch(intent)
            }

            override fun onPermissionDenied(deniedPermissions: MutableList<String>?) {
                Toast.makeText(this@MainActivity, "권한이 설정되어 있지 않습니다!",
  					Toast.LENGTH_SHORT).show()
            }

        }

TedPermission.with(this)
    .setPermissionListener(permissionListener)
    .setPermissions(*permissions)
    .setDeniedMessage("Denied!")
    .check()

PermissionListener 객체를 생성하여 onPermissionGranted 함수에 권한이 허용됐을 경우 실행하고자 하는 코드를 입력한다.
권한 체크하는 코드는 with에 현재 context를 넣어주고 setPermissions에 위에서 선언한 permission 배열을 넣고 check() 함수를 부르면 된다.

profile
안녕하세요! 안드로이드 개발자입니다😊

0개의 댓글