Accompanist权限库:两次拒权后launchPermissionRequest无响应问题咨询
问题解答
关于无限请求权限
Android系统层面有明确限制:当用户**两次拒绝权限并勾选“不再询问”**后,系统会阻止应用再次弹出权限请求弹窗,这是系统的用户保护机制,所有权限框架(包括你使用的Accompanist)都无法绕过这个限制实现无限次请求。
判断launchPermissionRequest()是否能触发弹窗
可以通过cameraPermissionState.status.shouldShowRationale状态来判断:
- 当
shouldShowRationale为true:调用launchPermissionRequest()会正常弹出系统权限请求框 - 当
shouldShowRationale为false:此时要么是首次请求权限,要么是用户已经勾选“不再询问”拒绝了权限。这种情况下调用launchPermissionRequest()不会弹框,建议引导用户跳转到应用设置页手动开启权限。
优化后的示例代码
@OptIn(ExperimentalPermissionsApi::class) @Composable private fun FeatureThatRequiresCameraPermission() { val cameraPermissionState = rememberPermissionState( android.Manifest.permission.CAMERA ) val context = LocalContext.current if (cameraPermissionState.status.isGranted) { Text("Camera permission Granted") } else { Column { val textToShow = when { cameraPermissionState.status.shouldShowRationale -> { "相机权限对本功能很重要,请授予权限。" } !cameraPermissionState.status.shouldShowRationale && cameraPermissionState.status is PermissionStatus.Denied -> { "相机权限已被拒绝且无法自动请求,请前往应用设置手动开启。" } else -> { "本功能需要相机权限,请授予权限。" } } Text(textToShow) Button( onClick = { if (cameraPermissionState.status.shouldShowRationale) { cameraPermissionState.launchPermissionRequest() } else if (cameraPermissionState.status is PermissionStatus.Denied) { // 跳转到应用设置页 val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { data = Uri.fromParts("package", context.packageName, null) } context.startActivity(intent) } else { cameraPermissionState.launchPermissionRequest() } } ) { Text( if (cameraPermissionState.status is PermissionStatus.Denied && !cameraPermissionState.status.shouldShowRationale) { "前往设置开启" } else { "请求权限" } ) } } } }
内容的提问来源于stack exchange,提问作者sadat
相关产品推荐
相关产品推荐

