Android 如何使用imagestream(颤振)创建条形码扫描仪

Android 如何使用imagestream(颤振)创建条形码扫描仪,android,firebase,flutter,barcode-scanner,firebase-machine-learning,Android,Firebase,Flutter,Barcode Scanner,Firebase Machine Learning,我想创建一个Android应用程序,使用flatter/Dart在手机屏幕的上半部分显示当前的相机流,在下半部分显示条形码的结果。 以下是我想要的: 我目前的代码是: import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:camera/camera.dart'; import 'dart:async'; import 'package:firebase

我想创建一个Android应用程序,使用flatter/Dart在手机屏幕的上半部分显示当前的相机流,在下半部分显示条形码的结果。 以下是我想要的:

我目前的代码是:


import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:camera/camera.dart';
import 'dart:async';
import 'package:firebase_ml_vision/firebase_ml_vision.dart';
import 'package:flutter_barcode_scanner/flutter_barcode_scanner.dart';

final BarcodeDetector _barcodeDetector =
    FirebaseVision.instance.barcodeDetector();
String data = 'EMPTY DATA';

class ScanScreen extends StatefulWidget {
  static String id = 'scan_screen';
  //final CameraDescription camera = cameras.first;
  @override
  _ScanScreenState createState() => _ScanScreenState();
}

class _ScanScreenState extends State<ScanScreen> {
  CameraController _controller;
  Future<void> _initializeControllerFuture;
  CameraImage _savedImage;
  bool _cameraInitialized = false;
  void _initializeCamera() async {
    List<CameraDescription> cameras = await availableCameras();

    _controller = CameraController(
      cameras.first,
      ResolutionPreset.medium,
    );
    _initializeControllerFuture = _controller.initialize().then((_) async {
      // Start ImageStream
      await _controller
          .startImageStream((CameraImage image) => _processCameraImage(image));
//      setState(() {
//        _cameraInitialized = true;
//      });
    });
  }

  Future<String> readBarcode(CameraImage image) async {
      FirebaseVisionImageMetadata firebaseVisionImageMetadata =
          FirebaseVisionImageMetadata(
        rawFormat: image.format.raw,
        size: Size(image.width.toDouble(), image.height.toDouble()),
        rotation: ImageRotation.rotation0,
        planeData: image.planes
            .map(
              (plane) => FirebaseVisionImagePlaneMetadata(
                bytesPerRow: plane.bytesPerRow,
                height: plane.height,
                width: plane.width,
              ),
            )
            .toList(),
      );
      try{
      var barcode = await _barcodeDetector.detectInImage(
        FirebaseVisionImage.fromBytes(
          _concatenatePlanes(image.planes),
          firebaseVisionImageMetadata,
        ),
      );
      if (barcode != null && barcode.length > 0) {
        print(barcode.toString()+barcode.first.toString());
        return barcode.toString();
      } else {
        print('no barcode');
        return 'no barcode found';
      }
    } catch (e) {
      print(e);
      return 'error';
    }
  }

  void _processCameraImage(CameraImage image) async {
    _savedImage = image;
    await readBarcode(image).then((String result) {
      setState(() {
        print(result);
//data=result;
      });
    });
  }

  Uint8List _concatenatePlanes(List<Plane> planes) {
    final WriteBuffer allBytes = WriteBuffer();
    planes.forEach((plane) => allBytes.putUint8List(plane.bytes));
    return allBytes.done().buffer.asUint8List();
  }

  @override
  void initState() {
    super.initState();
    _initializeCamera();
    // startBarcodeScanStream();
  }

  startBarcodeScanStream() async {
    FlutterBarcodeScanner.getBarcodeStreamReceiver(
            "#ff6666", "Cancel", true, ScanMode.BARCODE)
        .listen((barcode) => print(barcode));
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    final size = MediaQuery.of(context).size;
    final deviceRatio = size.width / size.height;

    return Scaffold(
      appBar: AppBar(
        title: Text('Scan Product'),
      ),
      body: Container(
        color: Colors.black,
        child: Column(
          children: [
            Expanded(
              flex: 2,
              child: Stack(
                children: [
                  MaterialApp(
                    home: Padding(
                      padding:
                          EdgeInsets.symmetric(horizontal: 7.0, vertical: 10.0),
                      child: AspectRatio(
                        aspectRatio: _controller.value.aspectRatio,
                        child: CameraPreview(_controller),
                      ),
                    ),
                  ),
                ],
              ),
            ),
            SizedBox(
              height: 10.0,
            ),
            Expanded(
              flex: 2,
              child: Container(
                color: Colors.deepPurple,
                child: Text(
                  data,
                  style: TextStyle(
                    fontSize: 50.0,
                    fontWeight: FontWeight.bold,
                  ),
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

进口“包装:颤振/基础.dart”;
进口“包装:颤振/材料.省道”;
导入“包:摄像机/摄像机.dart”;
导入“dart:async”;
导入“包:firebase_ml_vision/firebase_ml_vision.dart”;
导入“包装:颤振条形码扫描仪/颤振条形码扫描仪.dart”;
最终条形码检测器\u条形码检测器=
FirebaseVision.instance.barcodeDetector();
字符串数据='空数据';
类ScanScreen扩展StatefulWidget{
静态字符串id='scan_screen';
//最终摄像机描述摄像机=摄像机。第一;
@凌驾
_ScanScreenState createState()=>\u ScanScreenState();
}
类_ScanScreenState扩展状态{
摄像机控制器(CameraController)控制器;;
未来(初始化控制未来);
CameraImage_savedImage;
bool\u camerainInitialized=false;
void _initializeCamera()异步{
列出摄像机=等待可用摄像机();
_控制器=摄像机控制器(
首先,
ResolutionPreset.medium,
);
_initializeControllerFuture=_controller.initialize()。然后(_)异步{
//启动ImageStream
等待控制器
.startImageStream((CameraImage图像)=>\u processCameraImage(图像));
//设置状态(){
//_camerainInitialized=真;
//      });
});
}
未来读取条形码(CameraImage图像)异步{
FirebaseVisionImageMetadata FirebaseVisionImageMetadata=
FirebaseVisionImageMetadata(
rawFormat:image.format.raw,
大小:大小(image.width.toDouble(),image.height.toDouble()),
旋转:ImageRotation.rotation0,
planeData:image.planes
.地图(
(平面)=>FireBaseVisionImage平面元数据(
拜特斯佩罗:飞机,拜特斯佩罗,
高度:平面高度,
宽度:平面。宽度,
),
)
.toList(),
);
试一试{
var条码=等待_条码检测器。检测图像(
FirebaseVisionImage.fromBytes(
_连接平面(图像平面),
firebaseVisionImageMetadata,
),
);
如果(条形码!=null&&barcode.length>0){
打印(barcode.toString()+barcode.first.toString());
返回条码.toString();
}否则{
打印(“无条形码”);
返回“未找到条形码”;
}
}捕获(e){
印刷品(e);
返回“错误”;
}
}
void\u processCameraImage(CameraImage映像)异步{
_savedImage=图像;
等待读取条形码(图像)。然后((字符串结果){
设置状态(){
打印(结果);
//数据=结果;
});
});
}
Uint8List_串联平面(列表平面){
最终WriteBuffer allBytes=WriteBuffer();
planes.forEach((plane)=>allBytes.putUint8List(plane.bytes));
返回allBytes.done().buffer.asUint8List();
}
@凌驾
void initState(){
super.initState();
_initializeCamera();
//StartBarcodeCanStream();
}
StartBarcodeCanStream()异步{
FlatterBarCodeScanner.getBarcodeStreamReceiver(
“#ff6666”,“取消”,正确,扫描模式。条形码)
.听((条形码)=>打印(条形码));
}
@凌驾
无效处置(){
_controller.dispose();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
最终大小=MediaQuery.of(context).size;
最终偏差=尺寸.宽度/尺寸.高度;
返回脚手架(
appBar:appBar(
标题:文本(“扫描产品”),
),
主体:容器(
颜色:颜色,黑色,
子:列(
儿童:[
扩大(
弹性:2,
子:堆栈(
儿童:[
材料聚丙烯(
主页:填充(
衬垫:
边缘组。对称(水平:7.0,垂直:10.0),
孩子:AspectRatio(
aspectRatio:_controller.value.aspectRatio,
子项:CameraPreview(_控制器),
),
),
),
],
),
),
大小盒子(
身高:10.0,
),
扩大(
弹性:2,
子:容器(
颜色:颜色。深紫色,
子:文本(
数据,
样式:TextStyle(
字体大小:50.0,
fontWeight:fontWeight.bold,
),
),
),
),
],
),
),
);
}
}
我得到的只是条码值的“条码”实例