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.
Per seguire questo tutorial, avrai bisogno di:
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.
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
"
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.
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"));
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.
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
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.
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.
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
"
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 receiveDetections (Detector.Detectionsrilevamenti) ); "
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
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.
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.