Google Play サービスの新しい機能であるバーコード/QR スキャナーを試しました。サンプルアプリケーションでは、ボタンをタップするとスキャンが開始され、タップでも結果が返されます。
最初に検出されたバーコード/QR をすぐに返すように動作を変更する方法はありますか?
これに興味を持ったのは私が初めてではありません。
前もって感謝します。
静的変数を作成しないことをお勧めします。彼らは後であなたを噛むでしょう。
私のお勧めは、何らかの種類のリスナー/コールバックを作成し、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());
アップデート!
将来の読者のために、このプロジェクトを使用できます。これには、ほぼすべてのデバイスでの全画面プレビューも含まれています。前の回答は確実な実装ではありませんでしたが、より迅速な解決策でした。github リポジトリにはすべての変更が含まれており、変更ログも確認してください。