Skip to content

Jetpack Compose 版本的权限申请

java

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun InCallView(
    navCtrl: NavHostController,
    modifier: Modifier = Modifier,
    viewModel: InCallViewModel = hiltViewModel()
) {

    val permissionState = remember {  mutableStateOf(emptyMap<String, Boolean>()) }
    val permissionLauncher = rememberLauncherForActivityResult(
        contract = ActivityResultContracts.RequestMultiplePermissions(),
        onResult = { permissions  ->
            // 更新权限状态
            permissionState.value = permissions
            // 检查录音和相机权限是否被授予
            val isAudioGranted = permissions[Manifest.permission.RECORD_AUDIO] ?: false
            val isCameraGranted = permissions[Manifest.permission.CAMERA] ?: false

            viewModel.dispatch(InCallViewAction.RequestPermission(
                isGranted = isAudioGranted && isCameraGranted,
                permission = listOf(Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA)
            ))
        }
    )

    LaunchedEffect(key1 = permissionState.value) {
        // 检查录音和相机权限是否都被授予
        val isAudioGranted = permissionState.value[Manifest.permission.RECORD_AUDIO] ?: false
        val isCameraGranted = permissionState.value[Manifest.permission.CAMERA] ?: false
        if (isAudioGranted && isCameraGranted) {
            viewModel.dispatch(InCallViewAction.Init(context = context))
        } else if (!isAudioGranted || !isCameraGranted) {
            // 如果权限没有被授予,则请求权限
            permissionLauncher.launch(arrayOf(Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA))
        }
    }
    LaunchedEffect(Unit) {
        permissionLauncher.launch(arrayOf(Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA))
    }

}