如何自动检测条形码/ QR

Jer*_*kub 5 android android-vision

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

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

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

先感谢您.

Tsu*_*esu 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

第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;
}
}
Run Code Online (Sandbox Code Playgroud)

最后一步: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());
Run Code Online (Sandbox Code Playgroud)


wax*_*911 7

更新!

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

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