【问题标题】:How to get detected barcode/QR automatically如何自动获取检测到的条码/二维码
【发布时间】:2015-10-27 14:58:12
【问题描述】:

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

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

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

提前谢谢你。

【问题讨论】:

    标签: android android-vision


    【解决方案1】:

    我建议不要创建静态变量。他们稍后会咬你。
    我的建议是在您的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());
    

    【讨论】:

    • 像魅力一样工作!这种方式比接受的答案更好。
    • 这篇文章还使用了类似的方法(活动回调),供那些想要额外参考该想法的人使用:stackoverflow.com/questions/32021193/… 我也同意这种方法比创建对您的活动的静态引用更好。
    • 效果很好!!谢谢
    • 正确和推荐的样式。奇迹般有效!谢谢。建议:正确排序上面的3个例子,对于初学者来说更容易实现。
    • 欣赏它。完美运行。
    【解决方案2】:

    更新

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

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

    【讨论】:

    • 谢谢,我试试看。
    • @JerabekJakub 不要忘记为好的答案投票。 (如果个人的代表点很少,则特别有意义)
    • 别担心,我的浏览器中还打开了这个页面,只是没有足够的时间尝试。 :-( 我会尽快做的。
    • 它有效,我已经完成并正在使用它..(并添加了相关代码,以防您需要知道如何启动ActivityForResult 并获得相关结果。)
    • 经过测试并且有效!非常感谢。答案已获得投票和批准!
    猜你喜欢
    • 2015-06-04
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    • 2018-01-26
    • 2017-12-30
    相关资源
    最近更新 更多