繁体   English   中英

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

[英]In android jetpack compose when using accompanist permission how to detect if user revoked permission i.e. denied permission twice

我想知道如何检测用户何时在伴奏权限库中撤销了权限(两次拒绝权限),我还检查了该库的 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)
        }
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM