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