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

