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

我一直在玩新的Google Barcode API的示例代码。 它将一个盒子和条码的值叠加在条形码的实时相机上。 (也面临)

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

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

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

更新:build立@ pm0733464的答案,我添加了一个callback接口(称为onFound)到我可以在活动中访问的Tracker类。 修改Google multi-tracker示例:

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

主要活动:

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

Solutions Collecting From Web of "如何在Google Play服务中使用新的Barcode API捕获条形码值?"

直接使用条码检测器

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

 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 } 

接收通知

另一种方法是build立一个stream水线结构,用于从相机预览video中接收检测到的条形码(参见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 } } 

为每个条形码创build一个此跟踪器的新实例,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示例以获取更多详细信息)。