Мой сканер 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
...