web-dev-qa-db-fra.com

Comment capturer des valeurs de codes-barres à l'aide de la nouvelle API de codes-barres dans les services Google Play?

J'ai joué avec l'exemple de code de la nouvelle API Google Barcode. Il superpose une boîte et la valeur du code-barres sur le flux de caméra en direct d'un code-barres. (Fait également face)

Je ne peux pas dire comment renvoyer une valeur de code-barres à mon application. A) Comment savoir quand un événement de détection s'est produit et B) comment accéder à ravValue pour l'utiliser dans d'autres parties de mon application. Quelqu'un peut-il m'aider?

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

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

MISE À JOUR: En s'appuyant sur la réponse de @ pm0733464, j'ai ajouté une interface de rappel (appelée onFound) à la classe Tracker à laquelle j'ai pu accéder dans l'activité. Adaptation de l'exemple 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);
    }
}

Activité principale:

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

Utilisation directe du détecteur de code-barres

Une approche consiste à utiliser le détecteur de code-barres directement sur une image bitmap, comme ceci:

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
}

Réception des notifications

Une autre approche consiste à mettre en place une structure de pipeline pour recevoir les codes-barres détectés à partir de la vidéo d'aperçu de la caméra (voir exemple MultiTracker sur GitHub). Vous définiriez votre propre tracker pour recevoir les codes-barres détectés, comme ceci:

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

Une nouvelle instance de ce tracker est créée pour chaque code-barres, la méthode onUpdate recevant la valeur de code-barres détectée.

Vous configurez ensuite la source de la caméra pour diffuser en continu des images dans le détecteur, en recevant les résultats dans votre tracker:

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

Plus tard, vous devez soit démarrer directement la source de la caméra, soit l'utiliser en conjonction avec une vue qui montre l'aperçu de la caméra (voir exemple MultiTracker pour plus de détails).

39
pm0733464