Fragment에서 권한 요청하기 (2021)

Activity Result를 받아오는 API가 변경되면서 Fragment.requestPermissions도 deprecated 되었다.

registerForActivityResult를 호출하고 ActivityResultContracts.RequestPermission을 인자로 전달해야한다.

val contract = ActivityResultContracts.RequestPermission()

val activityResultLauncher = registerForActivityResult(contract) { isGranted ->
    if (isGranted) {
        // 권한이 필요한 작업 수행
        startRecording()
    }
}

activityResultLauncher.launch(Manifest.permission.RECORD_AUDIO)

복수의 권한이 필요한 경우는 Contract를 RequestMultiplePermissions로 바꿔서 사용한다.

val permissions = arrayOf(
    Manifest.permission.RECORD_AUDIO,
    Manifest.permission.READ_CONTACTS,
)

val contract = ActivityResultContracts.RequestMultiplePermissions()

val activityResultLauncher = registerForActivityResult(contract) { resultMap ->
    val isAllGranted = permissions.all { e -> resultMap[e] == true }

    if (isAllGranted) {
        // 모든 권한이 필요한 작업 수행
    }

    if (resultMap[Manifest.permission.RECORD_AUDIO] == true) {
        // 일부 권한만 필요한 작업 수행
    }
}

activityResultLauncher.launch(permissions)

하지만 사진/동영상 촬영, 연락처 선택 등 일반적인 케이스는 기본적으로 제공하는 Contract를 활용하는 것으로 커버할 수 있다.

Leave a Comment

Your email address will not be published. Required fields are marked *