Citirea codurilor QR utilizând API Mobile Vision

Introducere

Codurile QR au devenit omniprezente în ultimii ani. Sunt sigur că ați văzut unul într-o reclamă în ziar sau pe un panou. În termeni de layman, codurile QR, precum toate celelalte coduri de bare, sunt imagini care sunt concepute pentru a fi citite de mașini. De obicei, acestea reprezintă un șir mic, cum ar fi o adresă URL scurtă sau un număr de telefon. Iată un exemplu de cod QR care conține adresa URL a paginii Tuts +:

Spre deosebire de codurile de bare tradiționale, care necesită hardware specializat, codurile QR pot fi citite cu exactitate de orice smartphone cu o cameră decentă.

Cea mai recentă versiune a setului SDK pentru servicii Google Play include API pentru vizionare mobilă, care, printre altele, face foarte ușor pentru dezvoltatorii Android să creeze aplicații capabile să detecteze și să citească coduri QR în timp real. În acest tutorial, vă voi ajuta să începeți cu asta.

Cerințe preliminare

Pentru a urma acest tutorial, veți avea nevoie de:

  • cea mai recentă versiune de Android Studio
  • un dispozitiv Android cu o cameră foto

1. Instalarea kitului SDK pentru Servicii Google Play

Înainte de a utiliza aplicația API pentru vizionare mobilă în aplicația dvs., trebuie să adăugați setul SDK 7.8 pentru servicii Google Play ca un compila dependența de dvs. aplicaţia ale modulului build.gradle.

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

Când apăsați pe Sincronizați acum , veți vedea o eroare care arată astfel:

Apasă pe Instalați un depozit și un proiect de sincronizare link pentru a instala SDK-ul.

2. Editarea aplicației Manifest

Adăugați următoarea linie în aplicațiile dvs. AndroidManifest.xml pentru a instala automat bibliotecile de detectare a codurilor de bare pe dispozitivele care încearcă să ruleze aplicația dvs.:

„xml

"

În plus, pe măsură ce folosiți camera aparatului pentru a capta codurile QR, trebuie să solicitați android.permission.CAMERA permisiune.

„xml

"

3. Citirea unui cod QR dintr-o fotografie

Să scriem acum un cod care poate citi un cod QR dintr-o fotografie stocată în aplicațiile dvs. bunuri pliant. Voi numi fotografia myqrcode.jpg. Dacă nu aveți niciun fel de fotografii care să conțină coduri de tip QR, puteți obține unele de pe Flickr.

Pasul 1: Conversia fotografiei în a Bitmap

Deoarece API pentru viziunea mobilă are nevoie de a Bitmap ca intrare, ar trebui mai întâi să convertiți fotografia într-o Bitmap. Pentru a face acest lucru, deschideți fotografia folosind deschis metodă a AssetManager clasa și trece InputStream a revenit la decodeStream Metodă de BitmapFactory. Pentru a vă menține simplu, faceți-o înăuntru onCreate metoda dvs. Activitate.

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

Pasul 2: Creați un detector de coduri de bare

Pentru a detecta codurile QR (și alte tipuri de coduri de bare), ar trebui să utilizați o instanță a codului de bare BarcodeDetector clasă. Următorul cod vă arată cum să creați una folosind BarcodeDetector.Builder:

java BarcodeDetector barcodeDetector = BarcodeDetector.Builder nou (acest) .setBarcodeFormats (Barcode.QR_CODE) .build ();

Rețineți că detectorul detectează, în mod implicit, codurile de bare din toate formatele acceptate. Am folosit setBarcodeFormats pentru a specifica explicit că detectorul ar trebui să detecteze numai codurile QR.

Pasul 3: Citiți codul QR

Utilizare Frame.Builder pentru a crea un Cadru folosind Bitmap ați creat mai devreme.

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

Suna detecta metodă a BarcodeDetector pentru a genera a SparseArray conținând toate codurile QR BarcodeDetector detectat în fotografia dvs..

java SparseArray barcodes = barcodeDetector.detect (myFrame);

Fiecare articol din SparseArray conține a coduri de bare obiect. Pentru a prelua conținutul brut al codului QR, puteți utiliza funcția coduri de bare obiecte rawValue camp. Cu toate acestea, vă sugerez să utilizați mai ușor de citit displayValue în loc. Iată câteva coduri care imprimă conținutul primului cod QR API detectat:

"java // Verificați dacă cel puțin un cod de bare a fost detectat dacă (barcodes.size ()! = 0)

// Imprimați mesajul codului QR Log.d ("Codurile QR ale mele", barcodes.valueAt (0) .displayValue); “

Dacă vă rulați Activitate acum, ar trebui să puteți vedea mesajul conținut în codul QR al fotografiilor.

4. Citirea unui cod QR utilizând camera

Aplicația API pentru vizionare mobilă vă face foarte ușor să detectați și să citiți coduri de bare utilizând aparatul foto al aparatului în timp real. Să creăm un nou Activitate care face asta.

Pasul 1: Definiți aspectul

Creați un nou fișier XML de aspect denumit activity_main.xml. Arhitectura ar trebui să aibă a SurfaceView pentru a afișa cadrele de previzualizare captate de aparatul foto. Dacă doriți, puteți adăuga și a TextView pentru a afișa conținutul codurilor QR identificate de API.

După ce utilizați a RelativeLayout pentru a poziționa ambele widget-uri, fișierul XML de aspect ar trebui să arate cam așa:

„xml

"

Pasul 2: Creați Activitate

Creați o nouă clasă Java numită MainActivity.java. Faceți-i o subclasă de Activitate și suprascrie-i onCreate metodă. În interiorul onCreate metoda, apel setContentView pentru a aplica aspectul creat în etapa anterioară. Apoi, utilizați findViewById pentru a obține referințe la widgeturile definite în layout.

"java setContentView (R.layout.activity_main);

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

Pentru a prelua un flux de imagini din camera foto a aparatului și a le afișa în SurfaceView, creați o nouă instanță a CameraSource folosind clasa CameraSource.Builder. Deoarece CameraSource are nevoie de a BarcodeDetector, creați unul folosind BarcodeDetector.Builder clasă. Dacă doriți, puteți ajusta dimensiunile previzualizării camerei utilizând setRequestedPreviewSize metodă.

"java barcodeDetector = noul BarcodeDetector.Builder (acest) .setBarcodeFormats (Barcode.QR_CODE) .build ();

cameraSource = noua cameraSource .Builder (aceasta, barcodeDetector) .setRequestedPreviewSize (640, 480) .build (); "

Apoi, adăugați un apel invers la SurfaceHolder din SurfaceView astfel încât să știți când puteți începe să desenați cadrele de previzualizare. Callback-ul ar trebui să pună în aplicare SurfaceHolder.Callback interfață.

"java cameraView.getHolder () addCallback (nou SurfaceHolder.Callback () @Overide public void surfaceCreated (SuportHolder holder

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

În interiorul surfaceCreated metoda, sunați start metodă a CameraSource pentru a începe desenarea cadrelor de previzualizare. Deoarece start metoda te așteaptă să te descurci IOException, ar trebui să-l suni din interiorul a încearcă să prinzi bloc.

java încercați cameraSource.start (cameraView.getHolder ()); captură (IOException ie) Log.e ("CAMERA SOURCE", ie.getMessage ());

În mod similar, în interiorul surfaceDestroyed metoda, sunați Stop metodă a CameraSource pentru a opri desenarea cadrelor de previzualizare.

java cameraSource.stop ();

Ta Activitate este aproape gata. Cu toate acestea, tot trebuie să spuneți BarcodeDetector ce ar trebui să facă atunci când detectează un cod QR. Creați o instanță a unei clase care implementează Detector.Processor și transferați-l la setProcessor metodă a BarcodeDetector. Android Studio va genera automat stub-uri pentru metodele interfeței.

"java barcodeDetector.setProcessor (nou Detector.Procesor() @Override public void release ()

@Override publice void receiveDetections (Detector.Detections detectări) ); "

În interiorul receiveDetections metoda, obțineți SparseArray de coduri de bare obiecte prin apelarea getDetectedItems metodă a Detector.Detections clasă. Acum puteți scrie codul pentru a face ceva cu codurile QR detectate, pentru că v-am arătat deja cum să lucrați SpareArray obiecte mai devreme în acest tutorial.

Iată cum puteți afișa codul QR displayValue în TextView:

"java final SparseArray barcodes = detectări.getDetectedItems ();

dacă (barcodes.size ()! = 0) barcodeInfo.post (new Runnable () // Utilizați metoda post a vocii public void TextView () barcodeInfo.setText (// Actualizați textul barcodes.valueAt (0 ) .displayValue);); “

Rețineți că trebuie să încorporați apelul la setText în interiorul unui apel la post metodă a TextView, deoarece receiveDetections nu rulează pe firul UI. Dacă nu faceți acest lucru, va duce la o eroare de executare.

Acum puteți compila și rula aplicația. Punctați camera aparatului dvs. la un cod QR și ar trebui să puteți vedea conținutul codului QR imediat.

Concluzie

În acest tutorial, ați învățat cum să utilizați API pentru viziunea mobilă pentru a citi codurile QR din imagini statice, precum și din fluxurile live de camere. Chiar dacă am lucrat doar cu coduri QR în acest tutorial, puteți utiliza API-ul pentru a citi alte formate de coduri de bare populare, cum ar fi UPC-A și EAN-13.

Pentru a afla mai multe despre API-ul viziunii mobile, vă recomandăm să vizitați documentația API.

Cod