如何自动获取检测到的条形码/QR



我尝试了谷歌播放服务的新功能-条形码/QR扫描仪。在示例应用程序中,扫描是通过点击按钮开始的,结果也会在点击时返回。

有没有办法改变它的行为,立即返回第一个检测到的条形码/QR?

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

提前谢谢。

我建议不要创建静态变量。它们稍后会咬你
我的建议是在TrackerFactory上创建某种侦听器/回调,并在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中,使用回调初始化检测器实例。此回调可用于监听首次检测到的条形码/二维码的数据。

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存储库包含所有更改,并检查更改日志。

  1. 主要活动.java
  2. 条形码捕获活动.java
  3. CameraSource.java
  4. 条形码图形跟踪器.java

最新更新