如何使用 Google Play 服务中的新条码 API 捕获条码值?

How to capture barcode values using the new Barcode API in Google Play Services?

我一直在玩新 Google 条码 API 中的示例代码。它在条形码的实时摄像头馈送上覆盖一个框和条形码值。 (还有脸)

我不知道如何 return 我的应用程序的条形码值。 A) 如何判断检测事件何时发生以及 B) 如何访问 ravValue 以便在我的应用程序的其他部分使用。有人可以帮忙吗?

https://developers.google.com/vision/multi-tracker-tutorial

https://github.com/googlesamples/android-vision

更新: 基于@pm0733464 的回答,我向 Tracker class 添加了一个回调接口(称为 onFound),我可以在 Activity 中访问它。调整 Google 多跟踪器示例:

GraphicTracker:

class GraphicTracker<T> extends Tracker<T> {
    private GraphicOverlay mOverlay;
    private TrackedGraphic<T> mGraphic;
    private Callback mCallback;

    GraphicTracker(GraphicOverlay overlay, TrackedGraphic<T> graphic, Callback callback) {
        mOverlay = overlay;
        mGraphic = graphic;
        mCallback = callback;
    }

    public interface Callback {
        void onFound(String barcodeValue);
    }

    @Override
    public void onUpdate(Detector.Detections<T> detectionResults, T item) {
        mCallback.onFound(((Barcode) item).rawValue);
        mOverlay.add(mGraphic);
        mGraphic.updateItem(item);
    }

BarcodeTrackerFactory :

class BarcodeTrackerFactory implements MultiProcessor.Factory<Barcode> {
    private GraphicOverlay mGraphicOverlay;
    private GraphicTracker.Callback mCallback;

    BarcodeTrackerFactory(GraphicOverlay graphicOverlay, GraphicTracker.Callback callback) {
        mGraphicOverlay = graphicOverlay;
        mCallback = callback;
    }

    @Override
    public Tracker<Barcode> create(Barcode barcode) {
        BarcodeGraphic graphic = new BarcodeGraphic(mGraphicOverlay);
        return new GraphicTracker<>(mGraphicOverlay, graphic, mCallback);
    }
}

主要Activity:

BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(context).build();
BarcodeTrackerFactory barcodeFactory = new BarcodeTrackerFactory(mGraphicOverlay, new GraphicTracker.Callback() {
    @Override
    public void onFound(String barcodeValue) {
        Log.d(TAG, "Barcode in Multitracker = " + barcodeValue);
    }
});
MultiProcessor<Barcode> barcodeMultiProcessor = new MultiProcessor.Builder<>(barcodeFactory).build();
barcodeDetector.setProcessor(barcodeMultiProcessor);

直接使用条码检测器

一种方法是直接在位图上使用条形码检测器,如下所示:

BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(context).build();
Frame frame = new Frame.Builder().setBitmap(bitmap).build();
SparseArray<Barcode> barcodes = barcodeDetector.detect(frame);
if (barcodes.size() > 0) {
    // Access detected barcode values
}

接收通知

另一种方法是设置管道结构以从相机预览视频中接收检测到的条形码(请参阅 GitHub 上的 MultiTracker example)。您可以定义自己的跟踪器来接收检测到的条形码,如下所示:

class BarcodeTrackerFactory implements MultiProcessor.Factory<Barcode> {
    @Override
    public Tracker<Barcode> create(Barcode barcode) {
        return new MyBarcodeTracker();
    }
} 

class MyBarcodeTracker extends Tracker<Barcode> {
    @Override
    public void onUpdate(Detector.Detections<Barcode> detectionResults, Barcode barcode) {
        // Access detected barcode values
    }
 }

为每个条形码创建此跟踪器的一个新实例,onUpdate 方法接收检测到的条形码值。

然后您设置相机源以连续将图像流式传输到检测器,在您的跟踪器中接收结果:

BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(context).build();
BarcodeTrackerFactory barcodeFactory = new BarcodeTrackerFactory();
barcodeDetector.setProcessor(
    new MultiProcessor.Builder<>(barcodeFactory).build());

mCameraSource = new CameraSource.Builder(context, barcodeDetector)
    .setFacing(CameraSource.CAMERA_FACING_BACK)
    .setRequestedPreviewSize(1600, 1024)
    .build();

稍后,您可以直接启动相机源或将其与显示相机预览的视图结合使用(有关详细信息,请参阅 MultiTracker example)。