Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import 'dart:typed_data';
- import 'package:camera/camera.dart';
- import 'package:firebase_ml_vision/firebase_ml_vision.dart';
- import 'package:flutter/foundation.dart';
- import 'package:flutter/material.dart';
- class CameraPreviewScanner extends StatefulWidget {
- @override
- _CameraPreviewScannerState createState() => _CameraPreviewScannerState();
- }
- class _CameraPreviewScannerState extends State<CameraPreviewScanner> {
- List<CameraDescription> cameras;
- CameraController controller;
- bool isReady = false;
- // CameraController _camera;
- bool _isDetecting = false;
- final _barcodeDetector = FirebaseVision.instance.barcodeDetector();
- @override
- void initState() {
- super.initState();
- _initializeCamera();
- }
- void _initializeCamera() async {
- cameras = await availableCameras();
- controller = new CameraController(cameras[0], ResolutionPreset.medium);
- await controller.initialize();
- setState(() {
- isReady = true;
- });
- startCameraForScanning(cameras[0]);
- }
- Future<void> startCameraForScanning(CameraDescription description) {
- return controller.startImageStream(
- (CameraImage image) {
- if (_isDetecting) return;
- FirebaseVisionImage firebaseImage = FirebaseVisionImage.fromBytes(
- _concatenatePlanes(image.planes),
- _buildMetaData(image,
- _rotationIntToImageRotation(description.sensorOrientation)),
- );
- _barcodeDetector.detectInImage(firebaseImage).then(
- (List<Barcode> barcodes) {
- if (barcodes.isNotEmpty) {
- setState(() {
- _isDetecting = true;
- });
- Scaffold.of(context).showSnackBar(
- SnackBar(content: Text("${barcodes[0].rawValue}")));
- }
- },
- ).whenComplete(() async {
- await Future.delayed(Duration(seconds: 5));
- setState(() {
- _isDetecting = false;
- });
- });
- },
- );
- }
- Future<CameraDescription> getCamera(CameraLensDirection dir) async {
- return await availableCameras().then(
- (List<CameraDescription> cameras) => cameras.firstWhere(
- (CameraDescription camera) => camera.lensDirection == dir,
- ),
- );
- }
- Uint8List _concatenatePlanes(List<Plane> planes) {
- final WriteBuffer allBytes = WriteBuffer();
- for (Plane plane in planes) {
- allBytes.putUint8List(plane.bytes);
- }
- return allBytes.done().buffer.asUint8List();
- }
- FirebaseVisionImageMetadata _buildMetaData(
- CameraImage image,
- ImageRotation rotation,
- ) {
- return FirebaseVisionImageMetadata(
- rawFormat: image.format.raw,
- size: Size(image.width.toDouble(), image.height.toDouble()),
- rotation: rotation,
- planeData: image.planes.map(
- (Plane plane) {
- return FirebaseVisionImagePlaneMetadata(
- bytesPerRow: plane.bytesPerRow,
- height: plane.height,
- width: plane.width,
- );
- },
- ).toList(),
- );
- }
- ImageRotation _rotationIntToImageRotation(int rotation) {
- switch (rotation) {
- case 0:
- return ImageRotation.rotation0;
- case 90:
- return ImageRotation.rotation90;
- case 180:
- return ImageRotation.rotation180;
- default:
- assert(rotation == 270);
- return ImageRotation.rotation270;
- }
- }
- Widget _buildImage() {
- return AspectRatio(
- aspectRatio: controller.value.aspectRatio,
- child: CameraPreview(controller),
- );
- }
- @override
- Widget build(BuildContext context) {
- if (!isReady) {
- return Container();
- }
- return Container(
- child: _buildImage(),
- );
- }
- @override
- void deactivate() {
- controller.stopImageStream();
- super.deactivate();
- }
- @override
- void dispose() {
- controller.dispose().then((_) {
- _barcodeDetector.close();
- });
- super.dispose();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement