我的二维码扫描器停止在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
...
答案 0 :(得分:1)
编辑:如弗兰克(Frank)所建议,问题在于相机的分辨率设置,如果该设置太低,则无法检测到QR码。将其置于“高”或更高位置可以解决此问题。
我通过将相机插件回滚到以下版本来解决了这个问题:“相机:^ 0.5.2 + 2”
不知道是什么在最新版本中完全破坏了android的ML视觉软件包,但这已经解决了问题。