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

Flutter如何实现扫描QR码同时拍摄当前扫描画面并解决摄像头占用问题?

Flutter 扫码同时捕获扫描画面实现方案

核心解决思路为复用同一个相机流同时做二维码识别与帧捕获,避免分别调用扫码库、系统相机导致的相机资源抢占、切换卡顿问题,从根源解决黑屏、重对焦、启动延迟的体验缺陷。

方案一:使用开箱即用的mobile_scanner库(推荐)

该库原生层已实现相机流复用逻辑,支持扫码成功同时返回当前扫描帧的二进制数据,无需额外适配相机逻辑。

实现步骤

  • 第一步:添加依赖到pubspec.yaml
dependencies:
  mobile_scanner: ^3.5.6
  • 第二步:初始化扫码控制器,开启返回图像配置
final MobileScannerController scannerController = MobileScannerController(
  returnImage: true, // 核心配置:开启后扫码回调会携带当前帧数据
  formats: [BarcodeFormat.qrCode], // 仅识别QR码,提升识别速度
);
  • 第三步:在扫码回调中同时获取二维码内容与扫描画面
MobileScanner(
  controller: scannerController,
  onDetect: (scannerCapture) {
    final List<Barcode> barcodeList = scannerCapture.barcodes;
    final Uint8List? scannedImage = scannerCapture.image;

    // 扫码成功且获取到画面时执行业务逻辑
    if (barcodeList.isNotEmpty && scannedImage != null) {
      String? qrContent = barcodeList.first.rawValue;
      // 此处可直接使用scannedImage做保存、上传、展示等操作,无需再调用系统相机
    }
  },
)

方案二:自定义相机流实现(适用于需要高度定制的场景)

如果需要自定义扫码UI、额外的相机控制逻辑,可以通过底层相机库自行实现流复用:

  • 依赖camera库获取相机实时流
  • 依赖zxing_lib/qr_code_dart_scan等纯Dart二维码解析库,逐帧解析相机流中的二维码
  • 需要捕获画面时,直接截取当前相机帧做格式转换后保存即可

常见适配问题

  • 安卓端返回的图像默认是YUV格式,需要自行做YUV转RGB处理,避免截图颜色异常
  • 图像角度偏差可通过MobileScannerController的deviceOrientation属性获取当前设备方向,对图像做对应角度旋转即可
  • 若需要将截图存入本地相册,需提前申请对应平台的存储权限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 03:45:03