startActitivyForResult Deprecated
전에는 갤러리에서 이미지를 가져오려면 startActitivyForResult를 사용했지만 Deprecated가 되며 구현 방식이 바뀌게 되었다. 이제는 registerForActivityResult를 활용하여 갤러리에서 이미지를 가져와야 한다.
1
2
3
4
5
6
7
8
9
10
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을 발생시키기 때문이다.
1
2
3
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을 사용하여 권한을 설정했다.
1
implementation 'io.github.ParkSangGwon:tedpermission:2.3.0'
app gradle파일에 해당 코드를 입력한 후 sync now를 한다.
1
2
private val permissions = arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
android.Manifest.permission.READ_EXTERNAL_STORAGE)
위처럼 확인하고자 하는 permission들을 배열에 담는다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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() 함수를 부르면 된다.