web-dev-qa-db-ja.com

Flutterでバーコードをスキャンする方法はありますか?

基本的に、QRコードをスキャンしてサーバーに接続するアプリを作成しています。次に、アプリは製品のバーコードをスキャンし、アイテムの写真を撮影してサーバーに送信します。私の質問は次のとおりです。

image_picker と衝突しないQRコードとバーコードをスキャンするFlutterプラグインはありますか?

ここに私がこれまで見つけたものがあります。

ご支援いただければ幸いです。ありがとう!


更新

barcode_scan の問題は解決されました。受け入れられた答えよりも高速であり、問​​題はかなり迅速に解決されたため、私はこれを使用することになりました。 iOSでの動作はAppleによって変更されるため、チェックサム番号などで異なる結果が得られる可能性があることに注意してください。

13
NatoBoram

私は以前にも同様の問題を抱えていましたが、あなたと同じように検索した後、私は全体を見つけることができませんでした。プラグインを自分で書くのが最良の方法だと決めました...だからここでプラグインの恥知らずなプラグイン= Dであり、それを使用している他の誰かから利益を得ることではありません。

それを見ることができます ここ 。しかし、私はそれを文書化したり、広範囲にわたってテストしたり、Pubで適切に公開したりする時間がありませんでした。そのため、走行距離は異なる場合があります。ただし、Android 4.4+(およびおそらく以下)、およびflutterがサポートするiOSデバイスで動作するはずです。Cameraプラグインと組み合わせてテストしたことはありませんが、理由はわかりません。それに問題があるでしょう。

他のほとんどのqrコードプラグインとは異なるアプローチを取ります。 AndroidまたはiOSウィンドウを作成してスキャンを実行し、フラッターに戻る代わりに、フラッターのテクスチャレンダリング機能を使用して、カメラをフラッターに直接レンダリングします。

さらに考慮すべき点は、Google Mobile Vision SDKとそれに付随する適切なライセンスと機能を使用することです(Androidの最新バージョンのPlay Servicesが必要です)。そして、それは現在、バーコードスキャンからの情報の最も基本的な抽出のみをサポートしていること-私は未処理のテキストを出力するだけでよいので、それがすべてでした。

使用するには、これをpubspec.yamlに追加します。

dependencies:
  qr_mobile_vision: '^0.0.7'

そして、次のように実装します。

import 'package:qr_mobile_vision/QrCamera.Dart';

...

new Container(
  constraints: new BoxConstraints.loose(
  new Size(cameraSize, cameraSize)),
  child: new QrCamera(
    qrCodeCallback: (code) {
      print(code);
    }
  ),
)

私は最終的にドキュメント/テスト/などを仕上げることを計画していますが、それを試してみてください。あなたがそれを使用することに決め、それをサポートしない機能を必要とする場合、私はmayそれを実装するのを助けることができます...しかしPRは歓迎され奨励されます!

UPDATE:これにはバーコードのサポートが含まれています。 QrCameraをインスタンス化するときに、サポートするQRコード/バーコードのタイプを渡すことができます。デフォルトはallであり、より多くの処理が必要になるため、特定のタイプを使用する場合は、渡すことをお勧めします。

12
rmtmckenzie

現在、QR生成プラグインのコンパニオンとして何かに取り組んでいます( https://github.com/lukef/qr.flutter )が、残念ながら特定のタイムラインはありません。

私の計画は、Textureオブジェクトを使用してカメラを接続し(またはフォーク/カメラプラグインを使用)、Google Vision APIを使用することです( https://developers.google.com/vision/ Android/barcodes-overview )。

それはまともな些細なことであるはずです、私はちょうど時間を見つける必要があります。いずれにせよ、それをしたい場合、それは計画でした:)

1
Luke

オープンソースSDK(例、ZXing)または市販のSDK(例、Dynamsoft Barcode Reader SDKを使用できます。 )Flutterプロジェクトで。バーコードスキャン機能の実装は簡単です。

私は記事を書きました- Flutter Programming with Android AAR File 、フラッタープロジェクトでQRコードをスキャンする方法を共有します。 ソースコード GitHubでも入手できます。

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();
    }

ダーツコード

@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();
    });
  }

スクリーンショット

enter image description here

だから少し時間をかけて自分でやる:)

0
yushulx