Leggere i codici QR utilizzando l'API di Mobile Vision

introduzione

I codici QR sono diventati onnipresenti negli ultimi anni. Sono sicuro che ne hai visto uno su un giornale o su un cartellone pubblicitario. In parole povere, i codici QR, come tutti gli altri codici a barre, sono immagini progettate per essere lette dalle macchine. Di solito rappresentano una piccola stringa, ad esempio un URL abbreviato o un numero di telefono. Ecco un codice QR di esempio che contiene l'URL della homepage di Tuts +:

A differenza dei codici a barre tradizionali, che richiedono hardware specializzato, i codici QR possono essere letti con precisione da qualsiasi smartphone dotato di una fotocamera decente.

L'ultima versione dell'SDK dei servizi di Google Play include l'API di visione mobile che, tra le altre cose, rende molto facile per gli sviluppatori Android creare app in grado di rilevare e leggere i codici QR in tempo reale. In questo tutorial, ti aiuterò a iniziare.

Prerequisiti

Per seguire questo tutorial, avrai bisogno di:

  • l'ultima versione di Android Studio
  • un dispositivo Android con una fotocamera

1. Installazione dell'SDK di Google Play Services

Prima di utilizzare l'API di visione mobile nella tua app, devi aggiungere l'SDK 7.8 dei servizi di Google Play come compilare dipendenza nel tuo App modulo di build.gradle.

groovy compile 'com.google.android.gms: play-services: 7.8.0'

Quando si preme il Sincronizza ora pulsante, vedrai un errore simile a questo:

Clicca il Installa repository e sincronizza progetto link per installare l'SDK.

2. Modifica dell'app manifest

Aggiungi la seguente riga alla tua app AndroidManifest.xml per installare automaticamente le librerie di rilevamento dei codici a barre sui dispositivi che tentano di eseguire la tua app:

"xml

"

Inoltre, poiché utilizzerai la fotocamera del dispositivo per acquisire i codici QR, dovresti richiedere il android.permission.CAMERA autorizzazione.

"xml

"

3. Leggere un codice QR da una foto

Scriviamo ora un codice che può leggere un codice QR da una foto memorizzata nella tua app risorse cartella. Ho intenzione di dare un nome alla foto myqrcode.jpg. Se non hai foto a portata di mano con codici QR a portata di mano, puoi averne alcune da Flickr.

Passaggio 1: Converti la foto in a Bitmap

Perché l'API di visione mobile ha bisogno di a Bitmap come input, dovresti prima convertire la tua foto in a Bitmap. Per fare ciò, apri la foto usando il Aperto metodo del AssetManager classe e passare il InputStream restituito al decodeStream metodo di BitmapFactory. Per semplificare, fallo all'interno di onCreate metodo del tuo Attività.

java Bitmap myQRCode = BitmapFactory.decodeStream (getAssets (). open ("myqrcode.jpg"));

Passaggio 2: creare un rilevatore di codici a barre

Per rilevare i codici QR (e altri tipi di codici a barre), è necessario utilizzare un'istanza di BarcodeDetector classe. Il codice seguente mostra come crearne uno usando BarcodeDetector.Builder:

java BarcodeDetector barcodeDetector = new BarcodeDetector.Builder (this) .setBarcodeFormats (Barcode.QR_CODE) .build ();

Si noti che il rilevatore, per impostazione predefinita, rileverà i codici a barre di tutti i formati supportati. Ho usato il setBarcodeFormats metodo per specificare esplicitamente che il rilevatore dovrebbe rilevare solo i codici QR.

Passaggio 3: leggere il codice QR

Uso Frame.Builder creare un Telaio usando il Bitmap hai creato prima.

java Frame myFrame = new Frame.Builder () .setBitmap (myQRCode) .build ();

Chiama il individuare metodo del BarcodeDetector generare un SparseArray contenente tutti i codici QR BarcodeDetector rilevato nella tua foto.

java SparseArray barcode = barcodeDetector.detect (myFrame);

Ogni oggetto del SparseArray contiene a Codice a barre oggetto. Per recuperare i contenuti grezzi del codice QR, puoi usare il Codice a barre oggetto di rawValue campo. Tuttavia, ti suggerisco di usare il più facile da leggere DisplayValue campo invece. Ecco un codice che stampa il contenuto del primo codice QR rilevato dall'API:

"java // Controlla se è stato rilevato almeno un codice a barre se (barcodes.size ()! = 0)

// Stampa il messaggio del codice QR Log.d ("Dati del mio QR Code", barcodes.valueAt (0) .displayValue); "

Se gestisci il tuo Attività ora dovresti essere in grado di vedere il messaggio contenuto nel codice QR della tua foto.

4. Leggere un codice QR usando la fotocamera

L'API di visione mobile rende anche molto facile per te rilevare e leggere i codici a barre utilizzando la fotocamera del tuo dispositivo in tempo reale. Creiamo un nuovo Attività questo fa proprio questo.

Passaggio 1: definire il layout

Creare un nuovo file XML di layout chiamato activity_main.xml. Il layout dovrebbe avere a SurfaceView per visualizzare i fotogrammi di anteprima catturati dalla fotocamera. Se vuoi, puoi anche aggiungere un TextView per visualizzare il contenuto dei codici QR rilevati dall'API.

Dopo aver usato a RelativeLayout per posizionare entrambi i widget, il file XML di layout dovrebbe assomigliare a questo:

"xml

"

Passaggio 2: creare il Attività

Crea una nuova classe Java chiamata MainActivity.java. Ne fanno una sottoclasse di Attività e scavalca il suo onCreate metodo. Dentro il onCreate metodo, chiama setContentView per applicare il layout creato nel passaggio precedente. Quindi, usa findViewById per ottenere riferimenti ai widget definiti nel layout.

"java setContentView (R.layout.activity_main);

cameraView = (SurfaceView) findViewById (R.id.camera_view); barcodeInfo = (TextView) findViewById (R.id.code_info); "

Per recuperare un flusso di immagini dalla fotocamera del dispositivo e visualizzarle nel SurfaceView, crea una nuova istanza di CameraSource classe usando CameraSource.Builder. Perché il CameraSource ha bisogno di a BarcodeDetector, crearne uno usando il BarcodeDetector.Builder classe. Se lo desideri, puoi regolare le dimensioni dell'anteprima della videocamera usando il setRequestedPreviewSize metodo.

"java barcodeDetector = new BarcodeDetector.Builder (this) .setBarcodeFormats (Barcode.QR_CODE) .build ();

cameraSource = new CameraSource .Builder (this, barcodeDetector) .setRequestedPreviewSize (640, 480) .build (); "

Quindi, aggiungere una richiamata al SurfaceHolder del SurfaceView in modo che tu sappia quando puoi iniziare a disegnare i fotogrammi di anteprima. Il callback dovrebbe implementare il SurfaceHolder.Callback interfaccia.

"java cameraView.getHolder (). addCallback (new SurfaceHolder.Callback () @Override public void surfaceCreated (proprietario di SurfaceHolder)

@Override public void surfaceChanged (titolare di SurfaceHolder, int format, int width, int height)  @Override public void surfaceDestroyed (titolare di SurfaceHolder) ); "

Dentro il surfaceCreated metodo, chiama il inizio metodo del CameraSource per iniziare a disegnare i fotogrammi di anteprima. Perché il inizio metodo si aspetta che tu gestisca un IOException, dovresti chiamarlo dall'interno di a prova a prendere bloccare.

java try cameraSource.start (cameraView.getHolder ()); catch (IOException ie) Log.e ("CAMERA SOURCE", ie.getMessage ());

Allo stesso modo, dentro il surfaceDestroyed metodo, chiama il Stop metodo del CameraSource per smettere di disegnare i fotogrammi di anteprima.

java cameraSource.stop ();

Il tuo Attività è quasi pronto Tuttavia, devi ancora dirlo al BarcodeDetector cosa dovrebbe fare quando rileva un codice QR. Creare un'istanza di una classe che implementa il Detector.Processor interfaccia e passalo al setProcessor metodo del BarcodeDetector. Android Studio genererà automaticamente stub per i metodi dell'interfaccia.

"java barcodeDetector.setProcessor (nuovo Detector.Processor() @Override public void release ()

@Override public void receiveDetections (Detector.Detections rilevamenti) ); "

Dentro il receiveDetections metodo, prendi il SparseArray di Codice a barre oggetti chiamando il getDetectedItems metodo del Detector.Detections classe. Ora puoi scrivere il codice per fare qualcosa con i codici QR rilevati, perché ti ho già mostrato come lavorare SpareArray oggetti precedenti in questo tutorial.

Ecco come puoi visualizzare il codice QR DisplayValue nel TextView:

"java final SparseArray barcodes = detections.getDetectedItems ();

if (barcodes.size ()! = 0) barcodeInfo.post (new Runnable () // Usa il metodo post di TextView public void run () barcodeInfo.setText (// Aggiorna il TextView barcodes.valueAt (0 ) .displayValue);); "

Si noti che è necessario incorporare la chiamata al setText metodo all'interno di una chiamata al inviare metodo del TextView, perché receiveDetections non funziona sul thread dell'interfaccia utente. In caso contrario, si verificherà un errore di runtime.

Ora puoi compilare ed eseguire la tua app. Punta la fotocamera del tuo dispositivo su un codice QR e dovresti essere in grado di vedere immediatamente il contenuto del codice QR.

Conclusione

In questo tutorial, hai imparato a utilizzare l'API di visione mobile per leggere i codici QR da immagini statiche e da streaming di telecamere live. Anche se in questo tutorial abbiamo solo lavorato con i codici QR, puoi anche utilizzare l'API per leggere altri formati di codici a barre popolari come UPC-A ed EAN-13.

Per ulteriori informazioni sull'API di visione mobile, ti consiglio di visitare la documentazione dell'API.