web-dev-qa-db-fra.com

Existe-t-il un moyen de numériser des codes à barres dans Flutter?

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.

J'apprécie toute aide que vous pouvez fournir. Merci!

7
NatoBoram

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 :)

1
Luke

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

 enter image description here

Alors prenez un peu de temps et faites le vous même :)

0
yushulx