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

使用ZXing.Net.Maui检测二维码后截图黑屏的技术求助

解决ZXing.Net.Maui捕获二维码图像黑屏问题

问题分析

检测到二维码后调用CaptureAsync()返回黑屏,核心原因:

  • 条码检测事件触发时,相机预览帧尚未完成渲染,立即捕获会拿到未初始化的黑屏帧
  • BarcodesDetected事件会连续触发,多次调用捕获方法导致帧冲突

修复步骤

1. 控制条码检测触发频率

修改条码检测事件逻辑,捕获前暂停检测避免重复触发,完成后恢复检测:

private async void zxing_BarcodesDetected(object sender, BarcodeDetectionEventArgs e)
{
    zxing.IsDetecting = false;

    var first = e.Results?.FirstOrDefault();
    if (first is not null)
    {
        await Dispatcher.DispatchAsync(async () =>
        {
            await CaptureScreenshotAsync();
            zxing.IsDetecting = true;
        });
    }
    else
    {
        zxing.IsDetecting = true;
    }
}

2. 延迟捕获确保帧就绪

在捕获方法中添加短暂延迟,等待相机帧完全渲染:

private async Task CaptureScreenshotAsync()
{
    try
    {
        await Task.Delay(100); // 等待帧就绪
        var screenshot = await zxing.CaptureAsync();
        
        if (screenshot != null)
        {
            using var stream = await screenshot.OpenReadAsync();
#if ANDROID
            // 适配Android 13+的MediaStore存储方式,规避权限问题
            var context = Android.App.Application.Context;
            var contentValues = new ContentValues();
            contentValues.Put(MediaStore.Images.Media.Columns.DisplayName, $"captured_qr_{DateTime.Now:yyyyMMdd_HHmmss}.png");
            contentValues.Put(MediaStore.Images.Media.Columns.MimeType, "image/png");
            contentValues.Put(MediaStore.Images.Media.Columns.RelativePath, Android.OS.Environment.DirectoryDcim);

            var uri = context.ContentResolver.Insert(MediaStore.Images.Media.ExternalContentUri, contentValues);
            if (uri != null)
            {
                using var fileStream = context.ContentResolver.OpenOutputStream(uri);
                if (fileStream != null)
                {
                    await stream.CopyToAsync(fileStream);
                    await DisplayAlert("完成", "已保存到DCIM目录", "确定");
                }
            }
#endif
        }
    }
    catch (Exception ex)
    {
        await DisplayAlert("错误", $"错误信息: {ex.Message}", "确定");
        zxing.IsDetecting = true; // 出错后恢复检测
    }
}

3. 检查权限配置

在AndroidManifest.xml中添加必要权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" android:maxSdkVersion="33" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />

4. 确认ZXing初始化

在MauiProgram.cs中确保注册条码阅读器:

builder.UseBarcodeReader();

内容的提问来源于stack exchange,提问作者abo shereen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 08:57:04