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.
Pentru a urma acest tutorial, veți avea nevoie de:
Î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.
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
"
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.
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"));
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.
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
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.
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.
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
"
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 publice void receiveDetections (Detector.Detectionsdetectă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
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.
Î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.