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

标签 android android-jetpack-compose android-permissions android-camerax jetpack-compose-accompanist

我想知道如何检测用户何时在 accompanist permission library 中撤销了权限(两次拒绝权限) ,我也查了library's GitHub repository sample 很旧。
我在用,

compose_version = '1.2.0-alpha03'


accompanist_version = '0.24.2-alpha'


这是我的代码 fragment ,
@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()
    }
}

关于android - 在android jetpack compose中使用伴奏权限时如何检测用户是否撤销权限,即两次拒绝权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71191586/

相关文章:

android - 如何显示具体的商品数量?

android - Jetpack compose dialogFragment 等效

android - 为什么要添加 READ_PHONE_STATE 权限?

java - 仅在 Android 6.0 中没有此类文件或目录

Android UI 线程消息队列调度顺序

android - 带工具栏的 SwipeRefreshLayout (v4) 隐藏 ListView

android - Xposed : How to hook a method of a nested class(inner class) in xposed framework.

android - Jetpack Compose 找到 parent 的宽度/长度

Android 6.0 (Marshmallow) READ_CONTACTS 权限允许在权限被拒绝时读取联系人姓名

java - 将 ArrayList 写入/读取文件的奇怪问题