Не обнаруживает QR-коды с помощью Firebase ml Kit на Android, но работает на IOS (флаттер) - PullRequest
0 голосов
/ 23 сентября 2019

Мой сканер qr-кода перестал работать на Android, и я не понимаю, почему ... Он работал ранее, и сканер все еще работает на iOS.

При сканировании Firebase ML kit просто возвращает пустой список, и я пробовал много разных устройств на 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
...
...