30

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

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

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

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

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

图形跟踪器

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);
    }

条码跟踪器工厂

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);
    }
}

主要活动:

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);
4

1 回答 1

40

直接使用条码检测器

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

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 示例)。您可以定义自己的 Tracker 来接收检测到的条形码,如下所示:

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 示例)。

于 2015-08-15T20:43:58.953 回答