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를 활용하는 것으로 커버할 수 있다.