.NET MAUI中Camera.MAUI.ZXing二次进入页面无法检测摄像头
.NET MAUI Camera.MAUI 二次进入页面无法检测摄像头的解决方法
问题场景
使用Camera.MAUI和Camera.MAUI.ZXing组件时,首次进入页面并授予相机权限后,InitializeCamera方法可正常检测到设备摄像头;但二次进入该页面时,NumCamerasDetected显示为0,摄像头无法被枚举。
核心原因
页面导航时CameraView的资源未正确释放,导致二次进入时系统无法重新枚举摄像头设备。
解决方案
1. 页面消失时彻底清理CameraView资源
重写OnDisappearing方法,停止摄像头、解绑事件并重置配置,避免资源占用:
protected override async void OnDisappearing() { base.OnDisappearing(); if (playing) { await cameraView.StopCameraAsync(); playing = false; } // 解绑事件防止内存泄漏 cameraView.BarcodeDetected -= Camera_OnDetected; // 重置CameraView核心配置 cameraView.BarCodeDecoder = null; cameraView.BarCodeOptions = null; cameraView.Camera = null; }
2. 强制刷新摄像头列表
在InitializeCamera方法开头,调用组件自带的刷新方法强制重新枚举摄像头:
private async void InitializeCamera() { // 强制刷新摄像头设备列表 cameraView.RefreshCameraList(); // 给系统留枚举设备的时间 await Task.Delay(100); // 后续原配置代码保持不变... cameraView.BarcodeDetected += Camera_OnDetected; cameraView.BarCodeDecoder = new ZXingBarcodeDecoder(); // 条码解码配置、启动摄像头逻辑... }
3. 优化异步调用逻辑
避免在MainThread.BeginInvokeOnMainThread中嵌套异步调用,改用更规范的主线程异步执行方式:
// 替换原代码中启动摄像头的主线程调用部分 if (cameraView.NumCamerasDetected > 0) { cameraView.Camera = cameraView.Cameras.FirstOrDefault(); await MainThread.InvokeOnMainThreadAsync(async () => { if (await cameraView.StartCameraAsync() == CameraResult.Success) { playing = true; } }); }
4. 完善权限检查逻辑
处理用户在后台修改权限的情况,确保二次进入时权限状态是最新的:
protected override async void OnAppearing() { base.OnAppearing(); var cameraStatus = await Permissions.CheckStatusAsync<Permissions.Camera>(); // 覆盖权限被拒绝或受限的所有情况 if (cameraStatus is PermissionStatus.Denied or PermissionStatus.Restricted) { var results = await Permissions.RequestAsync<Permissions.Camera>(); if (results != PermissionStatus.Granted) { await Application.Current.MainPage.DisplayAlert("Permisos de cámara", "Los permisos de la cámara han sido denegados, active manualmente los permisos para usar esta funcionalidad", "OK"); return; } } InitializeCamera(); }
内容的提问来源于stack exchange,提问作者Giorgio
相关产品推荐
相关产品推荐

