无法在Android上使用Firebase ml套件检测到QR码,但可在ios上使用(颤振)

时间:2019-09-23 11:08:40

标签: android flutter barcode-scanner firebase-mlkit

我的二维码扫描器停止在Android上运行,我不明白为什么...以前可以正常使用,但扫描器仍在iOS上运行。

Firebase ML套件在扫描时仅返回一个空列表,我尝试了许多不同的android设备和QR码,但没有任何效果(现在)。

我尝试清理并重新安装所有依赖项, 我试图清除Google Play服务中的所有数据,然后重新安装了该应用程序(以便重新安装ML模型)

我有一个想法,可能是图像格式不正确,来自摄像机的格式为YUV_420_888,我认为它会通过以下代码转换为NV21,但不能100%确定其工作方式。

令人讨厌的是,它确实在以前工作过,但是突然停止了工作。

这是我对QR扫描仪的实现,它从相机流中接收图像

class QRCodeReader {

  BarcodeDetector _barcodeDetector = FirebaseVision.instance.barcodeDetector(BarcodeDetectorOptions(barcodeFormats: BarcodeFormat.qrCode));

  void dispose() {
    _barcodeDetector.close();
  }

  void scanImage(CameraImage availableImage, ScanCompleted scanCompleted) async {
    final FirebaseVisionImageMetadata metadata = FirebaseVisionImageMetadata(
      rawFormat: availableImage.format.raw,
      size: Size(availableImage.width.toDouble(), availableImage.height.toDouble()),
      planeData: availableImage.planes.map((currentPlane) => FirebaseVisionImagePlaneMetadata(
        bytesPerRow: currentPlane.bytesPerRow,
        height: currentPlane.height,
        width: currentPlane.width
        )).toList(),
      rotation: ImageRotation.rotation0,
    );

    final FirebaseVisionImage visionImage = FirebaseVisionImage.fromBytes(availableImage.planes[0].bytes, metadata);

    //this list is empty on android
    List barCodes = await _barcodeDetector.detectInImage(visionImage);

    for(Barcode barcode in barCodes) {
      //process barcode...
    }

    scanCompleted();
  } 
}

我这样初始化流...

_initializeControllerFuture = _controller.initialize();
_initializeControllerFuture.whenComplete(() {
  setState((){
    _controller.startImageStream(_handleImageStream);
  });
});

void _handleImageStream(CameraImage availableImage) {
    if (!_isScanning && !_disposed) {
      final state = Provider.of<ScannerState>(context);
      _isScanning = true;

      qrReader.scanImage(availableImage, () => _isScanning = false);
    }
}

app / build.gradle

...
dependencies {
    ...
    api 'com.google.firebase:firebase-ml-vision-image-label-model:17.0.2'
}

apply plugin: 'com.google.gms.google-services'

build.gradle

buildscript {
    ...
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.1'
        classpath 'com.google.gms:google-services:4.2.0'
    }
}

AndroidManifest.xml

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


    <application
        android:name="io.flutter.app.FlutterApplication"
        ...>
        <meta-data
            android:name="com.google.firebase.ml.vision.DEPENDENCIES"
            android:value="barcode" />
        ...
    </application>

pubspec.yaml

...
dependencies:
  ...
  camera: ^0.5.4+2
  firebase_core: ^0.4.0+9
  cloud_firestore: ^0.12.9+4
  cloud_functions: ^0.4.1+1
  firebase_ml_vision: ^0.9.2+1
...

1 个答案:

答案 0 :(得分:1)

编辑:如弗兰克(Frank)所建议,问题在于相机的分辨率设置,如果该设置太低,则无法检测到QR码。将其置于“高”或更高位置可以解决此问题。

我通过将相机插件回滚到以下版本来解决了这个问题:“相机:^ 0.5.2 + 2”

不知道是什么在最新版本中完全破坏了android的ML视觉软件包,但这已经解决了问题。