5

Google Play サービスの新しい機能であるバーコード/QR スキャナーを試しました。サンプルアプリケーションでは、ボタンをタップするとスキャンが開始され、タップでも結果が返されます。

最初に検出されたバーコード/QR をすぐに返すように動作を変更する方法はありますか?

これに興味を持ったのは私が初めてではありません。

前もって感謝します。

4

2 に答える 2

15

静的変数を作成しないことをお勧めします。彼らは後であなたを噛むでしょう。
私のお勧めは、何らかの種類のリスナー/コールバックを作成し、TrackerFactoryそれを で使用することTrackersです。Fragmentsこれは、Adaptersおよび他の多くの Android クラスが使用するパターンなので、それらをコピーしてみませんか?

ステップ 1: (変更された部分のコード) でインターフェイスを作成しますBarcodeGraphicTracker。ここでリスナーが初期化され、最初に検出が成功したときに最終的なコールバック応答をTracker Activity(カメラが最初に開いた場所) に送信します。

public class BarcodeGraphicTracker extends Tracker<Barcode> {
    private GraphicOverlay<BarcodeGraphic> mOverlay;
    private BarcodeGraphic mGraphic;
    private NewDetectionListener mListener;

[...]
    @Override
    public void onNewItem(int id, Barcode item) {
        mGraphic.setId(id);
        if (mListener != null) mListener.onNewDetection(item);
    }

    public void setListener(NewDetectionListener mListener) {
        this.mListener = mListener;
    }
[...]
    public interface NewDetectionListener {
        void onNewDetection(Barcode barcode);
    }
}

ステップ 2: BarcodeTrackerFactory のコンストラクターを変更して、インターフェイスを実装します。リスナー インスタンスは、初期化のために渡されBarcodeGraphicTrackerます。コード:

public class BarcodeTrackerFactory implements MultiProcessor.Factory<Barcode> {
private BarcodeGraphicTracker.NewDetectionListener newDetectionListener;
private GraphicOverlay<BarcodeGraphic> mGraphicOverlay;

public BarcodeTrackerFactory(GraphicOverlay<BarcodeGraphic> barcodeGraphicOverlay, BarcodeGraphicTracker.NewDetectionListener listener) {
    mGraphicOverlay = barcodeGraphicOverlay;
    newDetectionListener = listener;
}

@Override
public Tracker<Barcode> create(Barcode barcode) {
    BarcodeGraphic graphic = new BarcodeGraphic(mGraphicOverlay);
    BarcodeGraphicTracker tracker = new BarcodeGraphicTracker(mGraphicOverlay, graphic);
    if (newDetectionListener != null) tracker.setListener(newDetectionListener);
    return tracker;
}
}

最終ステップ:Tracker Activityコールバックを使用して検出器インスタンスを初期化します。このコールバックは、最初に検出されたバー/QR コードからのデータをリッスンするために使用できます。

BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(context).build();
BarcodeTrackerFactory barcodeFactory = new BarcodeTrackerFactory(graphicOverlay,
new BarcodeGraphicTracker.NewDetectionListener() {
    @Override
    public void onNewDetection(Barcode barcode) {
        Log.d("Barcode detected! - " + barcode.displayValue);

        //To send the result back to the Activity which is waiting for the result
        Intent data = new Intent();
        data.putExtra(BarcodeObject, barcode);
        setResult(CommonStatusCodes.SUCCESS, data);
        finish();
    }
 });
barcodeDetector.setProcessor(new MultiProcessor.Builder<>(barcodeFactory).build());
于 2016-02-22T21:14:53.513 に答える
8

アップデート

将来の読者のために、このプロジェクトを使用できます。これには、ほぼすべてのデバイスでの全画面プレビューも含まれています。前の回答は確実な実装ではありませんでしたが、より迅速な解決策でした。github リポジトリにはすべての変更が含まれており、変更ログも確認してください。

  1. MainActivity.java
  2. BarcodeCaptureActivity.java
  3. CameraSource.java
  4. BarcodeGraphicTracker.java
于 2015-10-31T10:51:26.270 に答える