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

Flutter中能否用google_mlkit_barcode_scanning直接调用摄像头扫码?

Flutter中使用google_mlkit_barcode_scanning实现摄像头实时扫码方案

可以实现,但google_mlkit_barcode_scanning本身仅负责条码识别的核心逻辑,不提供摄像头预览与帧捕获能力,需要搭配摄像头插件(如官方camera插件)来完成实时扫码流程。以下是具体实现步骤:

1. 添加依赖

在pubspec.yaml中添加所需依赖:

dependencies:
  flutter:
    sdk: flutter
  google_mlkit_barcode_scanning: ^0.12.0 # 版本可根据最新稳定版调整
  camera: ^0.10.5+5 # 官方摄像头插件

执行flutter pub get安装依赖。

2. 配置权限

Android

在android/app/src/main/AndroidManifest.xml中添加摄像头权限:

<uses-permission android:name="android.permission.CAMERA" />

iOS

在ios/Runner/Info.plist中添加摄像头权限描述:

<key>NSCameraUsageDescription</key>
<string>需要使用摄像头进行条码扫描</string>

3. 核心代码实现

初始化摄像头与扫描器

import 'package:camera/camera.dart';
import 'package:google_mlkit_barcode_scanning/google_mlkit_barcode_scanning.dart';

late CameraController _cameraController;
late BarcodeScanner _barcodeScanner;
bool _isProcessing = false;

Future<void> initCameraAndScanner() async {
  // 获取可用摄像头,选择后置摄像头
  final cameras = await availableCameras();
  final backCamera = cameras.firstWhere(
    (cam) => cam.lensDirection == CameraLensDirection.back,
  );

  // 初始化摄像头控制器
  _cameraController = CameraController(
    backCamera,
    ResolutionPreset.medium, // 平衡性能与识别精度
    enableAudio: false,
  );
  await _cameraController.initialize();

  // 初始化条码扫描器,可指定识别格式(可选)
  final scanOptions = BarcodeScannerOptions(
    formats: [BarcodeFormat.qrCode, BarcodeFormat.code128],
  );
  _barcodeScanner = BarcodeScanner(options: scanOptions);

  // 启动摄像头帧流监听
  startScanning();
}

实时扫描逻辑

void startScanning() {
  _cameraController.startImageStream((CameraImage image) async {
    // 避免重复处理帧
    if (_isProcessing) return;
    _isProcessing = true;

    // 将摄像头帧转换为ML Kit所需的InputImage
    final inputImage = InputImage.fromCameraImage(
      image,
      _cameraController.description,
    );

    try {
      // 处理图像识别条码
      final barcodes = await _barcodeScanner.processImage(inputImage);
      if (barcodes.isNotEmpty) {
        final scannedBarcode = barcodes.first;
        // 处理识别结果,如展示、跳转等
        print('扫描到条码:${scannedBarcode.displayValue}');
        // 可选:停止扫描
        stopScanning();
      }
    } catch (e) {
      // 处理识别错误
      print('扫描出错:$e');
    } finally {
      _isProcessing = false;
    }
  });
}

void stopScanning() {
  _cameraController.stopImageStream();
  _barcodeScanner.close();
}

UI展示摄像头预览

@override
Widget build(BuildContext context) {
  if (!_cameraController.value.isInitialized) {
    return const Center(child: CircularProgressIndicator());
  }
  return Scaffold(
    body: Stack(
      children: [
        CameraPreview(_cameraController),
        // 可叠加扫描框、结果提示等UI组件
        Positioned(
          bottom: 20,
          left: 20,
          right: 20,
          child: Text('扫描条码中...'),
        ),
      ],
    ),
  );
}

注意事项

  • 权限申请:需提前向用户申请摄像头权限,可使用permission_handler插件简化流程。
  • 资源释放:在页面销毁时调用_cameraController.dispose()和_barcodeScanner.close(),避免内存泄漏。
  • 性能优化:根据设备性能调整摄像头分辨率,或添加扫描区域裁剪逻辑,减少识别计算量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:23:15