본문 바로가기
2023년 이전/Android

onActivityResult / onRequestPermissionsResult deprecated

by JeongUPark 2021. 12. 3.
반응형

이번에 작업을 하다가 보니

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