Fondamentalement, je crée une application qui scanne un code QR pour se connecter à un serveur. Ensuite, l'application scannera le code à barres des produits, prendra des photos de l'article et les enverra au serveur. Ma question est la suivante:
Existe-t-il un plugin Flutter pour scanner les codes QR et les codes-barres sans entrer en conflit avec image_picker
?
Voici ce que j'ai trouvé jusqu'à présent.
barcode_scan
. Fonctionne bien jusqu'à ce que vous ajoutiez une dépendance sur camera
ou image_picker
. Problème .BarcodeScannerPlugin
. Un issue est ouvert et pose le même problème que le plugin précédent.flutter_qrcode_reader
, obsolète. Apparemment, il ne construit pas .flutterZebraEmdk
est un projet vide sans README.md
.flutter_qr_mobile_vision
, ne prend pas en charge les codes à barres. Problème .J'apprécie toute aide que vous pouvez fournir. Merci!
Je travaille actuellement sur quelque chose qui accompagne mon plugin de génération QR ( https://github.com/lukef/qr.flutter ) mais je n'ai malheureusement pas de calendrier précis.
Mon plan consiste à utiliser l'objet Texture
et à connecter une caméra (ou à utiliser un plug-in de caméra) puis à utiliser l'API Google Vision ( https://developers.google.com/vision/Android/barcodes-overview ).
Cela devrait être décemment trivial, je dois juste trouver le temps. De toute façon, c'était le plan si vous voulez le faire :)
Vous pouvez utiliser un SDK open source (par exemple, ZXing) ou un kit de développement commercial (par exemple, Dynamsoft Barcode Reader SDK) dans votre projet Flutter. La mise en œuvre de la fonction de lecture de code à barres est simple.
J'ai écrit un article - Flutter Programming avec Android AAR File , expliquant comment analyser un code QR dans un projet Flutter. Le code source est également disponible sur GitHub.
Code Java
private String onGetBarcode(String json) {
String filename;
try {
JSONObject message = new JSONObject(json);
filename = message.getString("filename");
} catch (JSONException e) {
Log.e(TAG, "JSON exception", e);
return null;
}
String locationProvider;
String barcodeResult = "No barcode detected";
File file = new File(filename);
if (!file.exists()) {
barcodeResult = "No file exists: " + file.toString();
Toast.makeText(BarcodeReaderActivity.this, barcodeResult, Toast.LENGTH_LONG).show();
return null;
}
else {
Bitmap bitmap = BitmapFactory.decodeFile(file.toString());
BarcodeReader reader = new BarcodeReader("license");
ReadResult result = reader.readSingle(bitmap, Barcode.QR_CODE);
Barcode[] all = result.barcodes;
if (all != null && all.length == 1) {
barcodeResult = all[0].displayValue;
}
else {
barcodeResult = "no barcode found: " + file.toString();
}
bitmap.recycle();
}
JSONObject reply = new JSONObject();
try {
if (barcodeResult != null) {
reply.put("result", barcodeResult);
} else {
reply.put("result", "No barcode detected");
}
} catch (JSONException e) {
Log.e(TAG, "JSON exception", e);
return null;
}
return reply.toString();
}
Code de fléchette
@override
Widget build(BuildContext context) {
if (_isExisted) {
return new Material(
child: new Center(
child: new Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
new Text('Barcode Reader'),
new Input(
labelText: 'Please input the image path',
value: new InputValue(text: _filename),
onChanged: onTextChanged,
autofocus: true,
),
new Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
new RaisedButton(
child: new Text('Read'),
onPressed: _getBarcode
),
new RaisedButton(
child: new Text('Reset'),
onPressed: _resetResult
),
]
),
new Image.file(new File(_filename)),
new Text('$_result'),
]
)
)
);
}
else {
return new Material(
child: new Center(
child: new Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
new Text('Barcode Reader'),
new Input(
labelText: 'Please input the image path',
onChanged: onTextChanged,
autofocus: true,
),
new Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
new RaisedButton(
child: new Text('Read'),
onPressed: _getBarcode
),
new RaisedButton(
child: new Text('Reset'),
onPressed: _resetResult
),
]
),
new Text('$_result'),
]
)
)
);
}
}
Future<Null> _readBarcode() async {
final Map<String, String> message = <String, String>{'filename':_filename};
final Map<String, dynamic> reply = await HostMessages.sendJSON('getBarcode', message);
// If the widget was removed from the tree while the message was in flight,
// we want to discard the reply rather than calling setState to update our
// non-existent appearance.
if (!mounted)
return;
setState(() {
_result = reply['result'].toString();
});
}
Capture d'écran
Alors prenez un peu de temps et faites le vous même :)