Подтвердить что ты не робот

Как захватить значения штрих-кода с помощью нового API штрих-кода в сервисах Google Play?

Я играл с образцом кода из нового API штрих-кода Google. Он накладывает поле и значение штрих-кода на канал прямой передачи штрих-кода. (Также грани)

Я не могу сказать, как вернуть значение штрих-кода в мое приложение. A) Как узнать, когда произошло событие обнаружения, и B) как получить доступ к ravValue для использования в других частях моего приложения. Может ли кто-нибудь помочь с этим?

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

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

UPDATE: Основываясь на ответе @pm0733464, я добавил интерфейс обратного вызова (называемый onFound) в класс Tracker, к которому я мог получить доступ в 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);
    }
}

Основная деятельность:

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

Ответ 1

Непосредственно с использованием детектора штрих-кода

Один из подходов - использовать детектор штрих-кода непосредственно на растровом изображении, например:

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
}

Получение уведомлений

Другим подходом является создание структуры конвейера для приема обнаруженных штрих-кодов из предварительного просмотра камеры (см. Пример MultiTracker в GitHub). Вы бы определили свой собственный 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 для получения более подробной информации).