안드로이드 registerForActivityResult() (+권한 (Permission) 요청 및 얻어오기)

임현주·2022년 8월 23일
1
post-thumbnail


activity 에서 데이터를 주고 받을 수 있던 startActivityForResult()가 현재 Deprecated 되어 수정이 불가피해졌다. 더이상 미루지 말고 이를 대체할 수 있는 registerForActivityResult()를 사용해보자 !

dog 라는 String 값을 GiveActivity에서 TakeActivity로 보낸다고 가정해보자.

📮 GiveActivity : 데이터를 담아 보낸다.

// DOG_KEY 라는 key 상수를 선언했다고 가정
setResult(Activity.RESULT_OK, Intent().apply {
    putExtra(DOG_KEY, "dog")
})

finish()

데이터를 보내는 activity는 익숙할 것이다! putExtra() 메소드에 데이터를 담는다.

💌 TakeActivity : 데이터를 받는다.

private val resultLauncher =
    registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        if (result.resultCode == Activity.RESULT_OK) {
            result.data?.getStringExtra(DOG_KEY)?.let { text ->
                Toast.makeText(this, text, Toast.LENGTH_SHORT).show()
            }
        }
    }
    
override fun onCreate() {
    super.onCreate()
    val intent = Intent(this, GiveActivity::class.java)
    resultLauncher.launch(intent)
}

먼저 registerForActivityResult() 메소드를 통해 데이터를 받기 위한 런처, ActivityResultLauncher 를 정의한다. 이 때, registerForActivityResult()에는 ActivityResultContractActivityResultCallback 을 파라미터로 넘겨주어야 한다.

ActivityResultContract

우리가 결과를 호출하는 데에 필요한 입력 유형과 결과의 출력 유형을 정의한다.

예를 들어, 위의 코드에서는 다른 activity를 통해 값을 넘겨 받는 것이기 때문에 ActivityResultContracts.StartActivityForResult() 를 넘겨주어야한다.

만약 여러 가지 퍼미션 권한을 얻어 와야 하는 경우에는 ActivityResultContracts.RequestMultiplePermissions()을 선택하는 등, 상황에 따라 굉장히 많은 유형이 존재하므로 알맞은 것을 선택해 넘겨주면 된다.

ActivityResultCallback

해당 콜백에서는 ActivityResultContract로 정의한 출력 유형의 객체를 가져와 resultCode를 검증한 뒤, result.data 를 통해 원하는 데이터를 받아온다.

이렇게 ActivityResultLauncher 정의한 후, launch로 GiveActivity를 실행하면 데이터 주고 받기 끝!

권한 (Permission) 요청 및 얻어오기

작성하는 김에 위에 언급한 권한 얻어오기까지 해보자 🙌🏻

카메라 권한을 받아온다고 가정해보자.

private val cameraPermissionLauncher =
    registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
        if (isGranted) {
            startCamera(binding.viewFinder)
        } else {
            Toast.makeText(this, "권한을 받아오지 못했습니다.", Toast.LENGTH_SHORT).show()
            finish()
        }
    }
    
override fun onCreate() {
    super.onCreate()
    initViews()
}
    
private fun initViews() = with(binding) {
    if (ContextCompat.checkSelfPermission(
            this@CameraActivity,
            Manifest.permission.CAMERA
        ) == PackageManager.PERMISSION_GRANTED
    ) {
        startCamera(viewFinder)
    } else {
        cameraPermissionLauncher.launch(Manifest.permission.CAMERA)
    }
}

ContextCompat.checkSelfPermission() 을 통해 권한이 있는지 체크하고 런처를 실행해주면 끝!

여러 개의 퍼미션을 한번에 받아와야 한다면 ActivityResultContracts.RequestMultiplePermissions()을 넘겨주고 arrayList에 받아오고 싶은 권한들을 담아 체크하면 된다.

이제 더이상 구구절절 PERMISSION_REQUEST_CODE 와 같은 상수들을 따로 설정해주지 않아도 돼서 매우 편하다,,⭐️

마지막으로 주의할 점 ❗️

ActivityResultLauncher 콜백은 activity가 재생성될 때 무조건 다시 등록되어야 하기 때문에 onCreate()나 onStart()에서 선언해 주어야 한다. (launch는 상관없다!)

profile
🐰 피드백은 언제나 환영합니다

0개의 댓글