如何自动检测到 barcode/QR

How to get detected barcode/QR automatically

我尝试了新的 Google Play 服务功能 - Barcode/QR 扫描仪。在 sample 中,应用程序通过点击按钮开始扫描,结果也是 return 点击时编辑。

有没有办法将其行为更改为 return 立即检测到 barcode/QR?

我不是第一个对this感到好奇的人。

提前致谢。

更新

对于未来的读者,您可以使用 this project,其中包括几乎所有设备上的全屏预览。之前的答案不是一个可靠的实现,而是一个快速的解决方案。 github 存储库包含所有更改并检查更改日志。

  1. MainAcitivity.java
  2. BarcodeCaptureActivity.java
  3. CameraSource.java
  4. BarcodeGraphicTracker.java

我建议不要创建静态变量。他们以后会咬你的。
我的建议是在您的 TrackerFactory 上创建某种 listener/callback 并在您的 Trackers 上使用它。这是 FragmentsAdapters 和许多其他 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 中使用回调初始化检测器实例。此回调可用于侦听来自首次检测到的 Bar/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());