在android jetpack compose中使用伴奏权限时如何检测用户是否撤销权限,即两次拒绝权限

问题描述 投票:0回答:3

我想知道如何检测用户何时在伴奏者权限库中撤销权限(两次拒绝权限),我还检查了库的GitHub存储库并且示例是旧的。

我正在使用,

compose_version ='1.2.0-alpha03'

accompanist_version = '0.24.2-alpha'

这是我的代码片段,

@ExperimentalMaterial3Api
@ExperimentalPermissionsApi
@Composable
fun CameraPermission() {
    /* Camera permission state.*/
    val cameraPermissionState = rememberPermissionState(permission = Manifest.permission.CAMERA)

    val context = LocalContext.current
    val intent =Intent(
        Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
        Uri.fromParts("package", BuildConfig.APPLICATION_ID, null))

    when (cameraPermissionState.status) {

        /* If the camera permission is granted, then show screen with the feature enabled.*/
        PermissionStatus.Granted -> {
            Text("Camera permission Granted")
        }

        is PermissionStatus.Denied -> {
            /*
            * This is a rationale explaining why we need the camera permission.
            * We are displaying this because the user has denied the permission once.
            * */
            if (cameraPermissionState.status.shouldShowRationale) {
                /*
                * If the user has denied the permission but the rationale can be shown, then gently
                * explain why the app requires this permission
                * */
                Column {
                    Text(text = "The camera is important for this app. Please grant the permission.")
                    Button(onClick = { cameraPermissionState.launchPermissionRequest() }) {
                        Text("Grant permission")
                    }
                }
            } else {
                /*
                * If it's the first time the user lands on this feature, or the user doesn't want to
                * be asked again for this permission, explain that the permission is required
                * */
                Column {
                    Text(text = "Camera permission required for this feature to be available. Please grant the permission")
                    Button(onClick = { cameraPermissionState.launchPermissionRequest() }) {
                        Text("Grant permission")
                    }

/*todo("permission denied twice.")*/
                    Text(text = "Camera permission denied twice. Please grant the permission")
                    Button(
                        onClick = {
                            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                            context.startActivity(intent)
                        }
                    ) {
                        Text("Open settings to grant permission.")
                    }
                }
            }
        }
    }
}
android android-jetpack-compose android-permissions android-camerax jetpack-compose-accompanist
3个回答
8
投票

你需要启动launchPermissionRequest以获得足够的信息

var permissionAlreadyRequested by rememberSaveable {
    mutableStateOf(false)
}

val cameraPermissionState = rememberPermissionState(permission = Manifest.permission.CAMERA) {
    permissionAlreadyRequested = true
}

if (!permissionAlreadyRequested && !cameraPermissionState.shouldShowRationale) {
    SideEffect {
        cameraPermissionState.launchPermissionRequest()
    }
} else if (cameraPermissionState.shouldShowRationale) {
    ShowRationaleContent {
        cameraPermissionState.launchPermissionRequest()
    }
} else {
    ShowOpenSettingsContent {
        context.openSettings()
    }
}

2
投票

如果有人想要多重许可。这就是我必须处理的方式

@OptIn(ExperimentalPermissionsApi::class)
@Composable
fun RequestPermission(context: Context?,onPermissionsGranted:()->Unit) {
    val permissionAlreadyRequested = rememberSaveable {
        mutableStateOf(false)
    }

    val permissionState = rememberMultiplePermissionsState(
        permissions =
            listOf(
                Manifest.permission.ACCESS_FINE_LOCATION,
                Manifest.permission.ACCESS_COARSE_LOCATION
            )
    ) {
        permissionAlreadyRequested.value = true
        if (!it.values.contains(false)){
            onPermissionsGranted.invoke()
        }
    }

    if (!permissionAlreadyRequested.value && !permissionState.shouldShowRationale) {
        SideEffect {
            permissionState.launchMultiplePermissionRequest()
        }
    } else if (permissionState.shouldShowRationale) {
        ShowRationaleContent {
            permissionState.launchMultiplePermissionRequest()
        }

    } else {
        ShowOpenSettingsContent {
            val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
            val uri: Uri = Uri.fromParts("package", context.packageName, null)
            intent.data = uri
            context.startActivity(intent)
        }
    }

}

0
投票

基于shouldShowRationale的所有答案都不会很好地工作,因为rationale根据Android版本的不同而不同(笑)。根据时差检查我的实现:https://stackoverflow.com/a/77027650/12544067

© www.soinside.com 2019 - 2024. All rights reserved.