我想知道如何检测用户何时在伴奏者权限库中撤销权限(两次拒绝权限),我还检查了库的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.")
}
}
}
}
}
}
你需要启动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()
}
}
如果有人想要多重许可。这就是我必须处理的方式
@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)
}
}
}
基于shouldShowRationale的所有答案都不会很好地工作,因为rationale根据Android版本的不同而不同(笑)。根据时差检查我的实现:https://stackoverflow.com/a/77027650/12544067