이번에 작업을 하다가 보니
onActivityResult 와 onRequestPermissionsResult 가 deprecated가 되버렸다.
(이 프로젝트의 minSdkVersion 24 targetSdkVersion 29 였습니다.)
그래서 그럼 어떻게 해야하나 찾아보니 다음과 같은 작업을 통하여 작업 할 수 있었습니다.
onActivityResult
기존 onActivityResult는 다음과 같습니다.
class ActivityResultSampleActivity : AppCompatActivity() {
val FLAG_REQ_CAMERA = 101
fun startCamera(activity: Activity) {
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
activity.startActivityForResult(intent, Config.FLAG_REQ_CAMERA)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == Activity.RESULT_OK) {
when (requestCode) {
Config.FLAG_REQ_CAMERA -> {
if (data?.extras?.get("data") != null) {
val bitmap = data?.extras?.get("data") as Bitmap
val filename = newFileName()
val uri =
saveImageFile(contentResolver, filename, "image/jpg", bitmap)
}
}
}
}
}
}
하지만 deprecated이 후 다음과 같이 작업을 해주어야 합니다.
class AcivityResultSampleActivity : AppCompatActivity() {
private val registerForActivityResultLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
val bitmap = result.data?.extras?.get("data") as Bitmap
val filename = newFileName()
val uri =
saveImageFile(requireActivity().contentResolver, filename, "image/jpg", bitmap)
}
fun startCamera() {
registerForActivityResultLauncher.launch(Intent(MediaStore.ACTION_IMAGE_CAPTURE))
}
}
위와 같이 전역 변수로 registerForActivityResult에 대한 변수를 생성하고 launch로 실행을 해줍니다.
이때 유의 할 점은 전역변수로 생성하지 않고 함수에서 registerForActivityResult를 할 경우 다음과 같은 error를 볼 수 있습니다.
fun startCamera() {
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
val bitmap = result.data?.extras?.get("data") as Bitmap
val filename = newFileName()
val uri = saveImageFile(requireActivity().contentResolver, filename, "image/jpg", bitmap)
}.launch(Intent(MediaStore.ACTION_IMAGE_CAPTURE))
}
Fragments must call registerForActivityResult() before they are created (i.e. initialization, onAttach(), or onCreate()).
즉 위의 registerForActivityResult는 onAttach() 또는 onCreate()가 생성되기 전에 생성되어야 한다는 말입니다. 그래서 전역변수로 생성을 해주어야 합니다.
onRequestPermissionsResult
기존 onRequestPermissionsResult 은 다음과 같이 진행 합니다.
class requestPermissionResultSample : AppCompatActivity() {
fun reqeustPermission() {
ActivityCompat.requestPermissions(
activity, Config.CAMERA_PERMISSION,
Config.FLAG_PERM_CAMERA
)
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == Config.FLAG_PERM_CAMERA) {
if (PermissionUtil().isPermitted(baseContext, Config.CAMERA_PERMISSION)) {
startCamera()
} else {
Toast.makeText(this, "Permissions not granted by the user.", Toast.LENGTH_SHORT)
.show();
this.finish()
}
}
}
}
하지만 deprecated 이후에는 다음과 같이 진행 해야 합니다.
class reqeustPermissionResultSample : AppCompatActivity() {
private val requestPermissionLauncher =
registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { isGranted: Boolean ->
if (isGranted) {
startCamera()
} else {
Toast.makeText(context, "Permissions not granted by the user.", Toast.LENGTH_SHORT)
.show();
}
}
private fun requestPermission() {
requestPermissionLauncher.launch(CAMERA)
}
}
이렇게 해서 permission이 완료되면 isGranted에 true 가 들어옵니다.
그리고 2종류의 permission을 받아야한다면
requestPermissionLauncher.launch(READ_EXTERNAL_STORAGE)
requestPermissionLauncher.launch(WRITE_EXTERNAL_STORAGE)
이렇게 두번 주면되고 그럼 requestPermissionLauncher의 callback에 isGranted가 true로 1번 들어 옵니다. (이건 명확하지 않습니다.)
참고 : https://developer.android.com/training/permissions/requesting?hl=ko
'2023년 이전 > Android' 카테고리의 다른 글
ViewPager2에서 ui 업데이트 방법 (0) | 2021.12.03 |
---|---|
이미지 & 동영상 정보 가져오는 방법 (0) | 2021.12.03 |
Hilt를 사용한 ViewModel (0) | 2021.12.03 |
Hilt (0) | 2021.12.03 |
EditText의 유지 (0) | 2021.12.03 |