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
相关产品推荐
相关产品推荐

