Debbi Story

[Android] Permission 거부 처리 ActivityResultContracts 본문

안드로이드/Tip

[Android] Permission 거부 처리 ActivityResultContracts

Debbi 2021. 11. 17. 02:13
728x90

 

 

안녕하세요. 

기존에 많이 사용했던 아래 override 함수들을 대체할 ActivityResultContracts API가 새로 나왔습니다!

override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<out String>,
    grantResults: IntArray
) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
}

 

https://developer.android.com/reference/androidx/activity/result/contract/ActivityResultContracts

 

ActivityResultContracts  |  Android Developers

 

developer.android.com

 

requestpermission으로 요청했을때 거부를 두 번했을 경우 다시 request를 요청하면 아무런 반응이 없게됩니다.

 

사용자 입장에서는 오류로 인식 할 수도 있기에, 거부를 한 번했을때는 재요청을 할 수는 Alert, 거부를 두 번했을 경우 앱 설정으로 유도하는 Alert을 보여주는게 일반적인 방법이라고 생각합니다. 이 부분은 앱마다 처리 방법이 다를 수 있어서 절대적인것은 아닙니다.

 

private val requestPermissionLauncher =
    registerForActivityResult(
        ActivityResultContracts.RequestMultiplePermissions()
    ) { result: MutableMap<String, Boolean> ->

        val deniedList: List<String> = result.filter {
            !it.value
        }.map {
            it.key
        }

        when {
            deniedList.isNotEmpty() -> {
                val map = deniedList.groupBy { permission ->
                    if (shouldShowRequestPermissionRationale(permission)) "DENIED" else "EXPLAINED"
                }
                map["DENIED"]?.let {
                    // request denied , request again
                    // 거부 한 번 했을경우 재요청
                }
                map["EXPLAINED"]?.let {
                    // request denied ,send to settings
                    // 거부 두 번 했을경우 설정
                }
            }
            else -> {
                // All request are permitted
            }
        }
    }

 

제가 사용한것은 ActivityResultContracts.RequestMultiplePermissions() 

퍼미션 여러개를 요청할때 사용하는 API입니다. 하나만 할 수 있는 것도 있습니다. RequestPermission

 

 

사용 방법은 간단합니다. 퍼미션을 담은 Array를 넘겨주시면 됩니다!

requestPermissionLauncher.launch(permissions)