You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 04:36:01