2015-08-15 19 views
24

Ho giocato con il codice di esempio della nuova API di Google Barcode. Sovrappone una casella e il valore del codice a barre sul feed della telecamera live di un codice a barre. (Anche volti)Come acquisire i valori dei codici a barre utilizzando la nuova API per codici a barre in Google Play Services?

Non posso dire come restituire un valore di codice a barre alla mia app. A) Come sapere quando si è verificato un evento di rilevamento e B) come accedere a ravValue per l'uso in altre parti della mia app. Qualcuno può aiutare con questo?

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

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

UPDATE: Sulla base di @ pm0733464 risposta, ho aggiunto un'interfaccia di callback (chiamata onFound) alla classe Tracker che ho potuto accedere in attività. Adattamento del campione Multi-tracker di 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); 
    } 
} 

attività 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); 
+0

Sono interessato alla tua opinione finora. Quali sono le tue esperienze con l'API: quanto riconosce i codici a barre? Anche quando è un po 'buio? È veloce? Quindi nel complesso: è migliore di zxing? E infine, puoi fornire un esempio completo? – Dante

+0

C'è una nuova app di esempio del lettore di codici a barre su GitHub: https://github.com/googlesamples/android-vision/tree/master/visionSamples/barcode-reader – pm0733464

+1

@Dante Il codice che hai condiviso con 'callback' è stato molto utile per me. Molte grazie! –

risposta

35

Direttamente utilizzando il rilevatore barcode

Un approccio è quello di utilizzare il rivelatore di codice a barre direttamente su una bitmap, come questo:

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 
} 

Ricezione notifiche

Un altro approccio è quello di impostare una struttura di pipeline per la ricezione di codici a barre rilevati dal video di anteprima della videocamera (vedere MultiTracker example su GitHub). Faresti definire il proprio Tracker per ricevere i codici a barre rilevati, in questo modo:

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

Una nuova istanza di questo tracker viene creato per ogni codice a barre, con il metodo onUpdate riceve il valore del codice a barre rilevato.

È quindi configurare l'origine della fotocamera per lo streaming in modo continuo le immagini nel rivelatore, che riceve i risultati nel vostro inseguitore:

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

Più tardi, ci si sia iniziare la fonte fotocamera direttamente o utilizzare in combinazione con una vista che mostra l'anteprima della fotocamera (vedere MultiTracker example per ulteriori dettagli).

+0

Grazie mille - usare l'aggiornamento del Tracker sembra essere il callback che sto cercando. Con il modo in cui le classi sono impostate nell'esempio con le fabbriche e i costruttori, non mi sono reso conto di guardare all'interno della classe Tracker. – Scott

+0

FYI, usando la tua risposta Ho aggiunto un'interfaccia di callback alla classe Tracker in modo da poter accedere al codice a barre dall'attività principale. Ho aggiornato la mia domanda per includere questa soluzione. Sentiti libero di correggermi se ho trascurato qualcosa. – Scott

+1

Sembra buono. Se devi solo gestire i codici a barre nella tua app (e non i volti), ciò potrebbe essere semplificato modificando GraphicTracker in modo che erediti dal Tracker anziché generico. In questo modo, non è necessario eseguire il cast dell'oggetto (codice a barre) in onUpdate. – pm0733464