Как захватить значения штрих-кода с помощью нового 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);
Ответы
Ответ 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 для получения более подробной информации).