
startActivityForResult()는 Android API 30 (Android 11)부터 deprecated 되었다.
대신 Activity Result API 를 사용하는 것이 권장된다.
훨씬 더 깔끔하고 수명 주기에 안전하게 작동한다.
btnGallery.apply {
val getImageFromAlbum: Intent = Intent().apply {
action = Intent.ACTION_PICK
type = MediaStore.Images.Media.CONTENT_TYPE // 또는 type = "image/*"
}
setOnClickListener {
try {
startActivityForResult(getImageFromAlbum, REQUEST_PHOTO)
} catch (e: ActivityNotFoundException){ }
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (requestCode == REQUEST_PHOTO && data != null) {
val selectedUri: Uri = data.data ?: return
try {
// 결과 처리
} catch (e: Exception) {
e.printStackTrace()
}
}
}
갤러리 인텐트 실행후 onActivityResult에서 결과를 처리하는 기존의 방식이다.
private lateinit var galleryLauncher: ActivityResultLauncher<Intent>
ActivityResultLauncher를 선언한다.
galleryLauncher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val imageUri: Uri? = result.data?.data
imageUri?.let {
// 결과 처리
}
}
}
onCreate()에서 launcher를 초기화 한다. 여기서 결과 처리 로직을 작성한다.
btnGallery.setOnClickListener {
val intent = Intent(Intent.ACTION_PICK).apply {
type = "image/*"
}
try {
galleryLauncher.launch(intent)
} catch (e: ActivityNotFoundException) {
Toast.makeText(this, "갤러리 앱을 찾을 수 없습니다.", Toast.LENGTH_SHORT).show()
}
}
리스너에서는 갤러리 인텐트를 launcher를 통해 실행한다.