Android相机权限异常咨询:首次拒绝后仍重复请求权限
解决Android相机权限重复请求的问题
咱们先揪出问题根源:你的代码只处理了Granted和Unknown两种权限状态,完全漏掉了**用户明确拒绝权限(PermissionStatus.Denied)**的场景,而且没有遵循Android权限规则——当用户拒绝权限后,不能无限制重复请求,得根据拒绝的类型给出对应处理。
按照Android的权限逻辑:
- 第一次拒绝权限后,再次请求前要给用户说明权限用途;
- 如果用户拒绝且勾选了"不再询问",系统不会再弹出权限框,此时必须引导用户去应用设置手动开启权限。
下面是修复后的完整代码,我加了详细注释帮你理解:
var scanPage = new ZXingScannerPage(); var cameraStatus = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Camera); if (cameraStatus != PermissionStatus.Granted) { // 先判断是否是用户已明确拒绝且无法再次弹窗的情况 if (cameraStatus == PermissionStatus.Denied) { // 弹窗询问用户是否前往设置开启权限 var goToSettings = await DisplayAlert("权限提示", "扫码功能需要相机权限,请前往应用设置开启", "去设置", "取消"); if (goToSettings) { // 打开当前应用的设置页面 await CrossPermissions.Current.OpenAppSettingsAsync(); } // 直接返回,避免重复请求权限 return; } // 仅当权限未请求过(Unknown状态)时,发起权限请求 var results = await CrossPermissions.Current.RequestPermissionsAsync(new[] { Permission.Camera }); cameraStatus = results[Permission.Camera]; if (cameraStatus == PermissionStatus.Granted) { await Navigation.PushAsync(scanPage); scanPage.OnScanResult += (result) => { Device.BeginInvokeOnMainThread(async () => { await Navigation.PopAsync(); txtbarcode.Text = result.Text; }); }; } else if (cameraStatus == PermissionStatus.Denied) { // 请求后被拒绝,提示用户无法使用功能 await DisplayAlert("权限拒绝", "没有相机权限无法使用扫码功能", "确定"); } } else { // 权限已提前授予,直接打开扫码页面 await Navigation.PushAsync(scanPage); scanPage.OnScanResult += (result) => { Device.BeginInvokeOnMainThread(async () => { await Navigation.PopAsync(); txtbarcode.Text = result.Text; }); }; }
关键修复点说明
- 新增
PermissionStatus.Denied的全流程处理:不管是初始权限检查还是请求后的结果,都做了对应逻辑,避免无效的重复请求; - 区分"未请求过权限"和"已拒绝权限"场景:只有权限状态为
Unknown时才发起请求,符合Android权限规范; - 补充了权限已授予时的直接跳转逻辑:原来的代码如果权限一开始就是
Granted,根本不会打开扫码页面,这是个隐藏小bug; - 引导用户去设置开启权限:当用户拒绝且无法弹窗时,提供明确的解决路径,提升用户体验。
内容的提问来源于stack exchange,提问作者Eswar Rapeti
相关产品推荐
相关产品推荐

