Reading QR-koder du bruker mobil Vision API
21
Del
15
Del
Dette Cyber Monday Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.
Innledning
QR-koder har blitt allestedsnærværende i de siste årene. Jeg er sikker på at du har sett en i en avisannonse eller på en oppslagstavle. I lekmann vilkår, QR-koder, som alle andre strekkoder, er bilder som er laget for å bli lest av maskiner. Vanligvis, de representerer en liten streng, for eksempel en forkortet URL eller et telefonnummer. Her er et eksempel QR-kode som inneholder URL av Tuts + hjemmeside:.
I motsetning til tradisjonelle strekkoder, som trenger spesialisert maskinvare, QR-koder kan leses nøyaktig ved noen smarttelefon med en anstendig kamera
Den nyeste versjonen av Google Play tjenester SDK inneholder mobil visjon API som blant annet gjør det svært enkelt for Android-utviklere å lage programmer som er i stand til å oppdage og lese QR-koder i sanntid. I denne opplæringen, skal jeg hjelpe deg med å komme i gang med det
Forutsetninger
For å følge denne opplæringen, trenger du:.
en Android-enhet med et kamera
1. Installere Google Play Services SDK
Før du bruker mobil visjon API i programmet ditt, bør du legge til Google Play tjenester SDK 7.8 som en compile avhengighet i din app modulens build.gradle.
Kompilere 'com .google.android.gms: play-tjenester: 7.8.0 '
Når du trykker på Synkroniser nå-knappen, vil du se en feilmelding som ser slik ut:
Klikk på Installer depot og synkronisering prosjekt lenke å installere SDK.
2. Redigere App Manifest
Legg til følgende linje i appens AndroidManifest.xml å installere de strekkode gjenkjenning bibliotekene på enhetene som prøver å kjøre programmet ditt:
< meta-data android: name = " com.google.android.gms.vision.DEPENDENCIES "android: value =" barcode "/>
I tillegg, som du skal bruke enhetens kamera for å fange opp de QR-koder, bør du be om android.permission.CAMERA . tillatelse
< bruker-tillatelse android: name = "android.permission.CAMERA" />
3. Lese en QR-kode fra et bilde
La oss nå skrive noen kode som kan lese en QR-kode fra et bilde som er lagret i din app eiendeler mappe. Jeg kommer til å nevne foto myqrcode.jpg. Hvis du ikke har noen bilder som inneholder QR-koder hendig, kan du få noen fra Flickr
Trinn 1:. Konverter bilde til et Bitmap
Fordi mobil visjon API trenger en Bitmap som sitt innspill, bør du først konvertere et fargebilde til et Bitmap. For å gjøre dette, åpner du bilde ved hjelp av åpne metoden i AssetManager klasse og passere Input returnert til decodeStream metoden BitmapFactory. For å holde det enkelt, gjør det inne i onCreate metode for aktivitets
Bitmap myQRCode = BitmapFactory.decodeStream (getAssets () åpen ("myqrcode.jpg").);
Trinn 2:. Lag en Barcode Detector
For å oppdage QR-koder (og andre typer strekkoder), bør du bruke en forekomst av BarcodeDetector klassen. Følgende kode viser deg hvordan du kan opprette en bruker BarcodeDetector.Builder:
BarcodeDetector barcodeDetector = new BarcodeDetector.Builder (denne) .setBarcodeFormats (Barcode.QR_CODE) att bygga ();
Merk at detektoren vil, som standard , oppdage strekkoder av alle støttede formater. Jeg har brukt setBarcodeFormats metoden for å eksplisitt angi at detektoren skal bare oppdage QR-koder
Trinn 3:. Les QR-kode
Bruk Frame.Builder å skape en ramme ved hjelp av Bitmap du opprettet . tidligere
Frame myFrame = new Frame.Builder () .setBitmap (myQRCode) att bygga ();
Ring oppdage metoden i BarcodeDetector å generere en SparseArray inneholder alle QR-koder på BarcodeDetector oppdaget i bildet.
SparseArray < Barcode > strekkoder = barcodeDetector.detect (myFrame);
Hvert element av SparseArray inneholder en strekkode objekt. Å hente den rå innholdet i QR-kode, kan du bruke Barcode objektets rawValue feltet. Men, foreslår jeg at du bruker den lettere å lese displayValue feltet i stedet. Her er noen kode som skriver ut innholdet i den første QR-kode API oppdaget:
//Sjekk om minst en strekkode var detectedif {//Skriv ut QR-koden budskap Log.d (barcodes.size () = 0!) ("My QR-kodens data", barcodes.valueAt (0) .displayValue);.}
Hvis du kjører din aktivitet nå, bør du være i stand til å se meldingen som finnes i bildets QR-kode
4. Lese en QR-kode Bruk av kameraet
Mobil visjon API gjør det også veldig enkelt for deg å finne og lese strekkoder ved hjelp av enhetens kamera i sanntid. La oss lage en ny aktivitet som gjør nettopp det
Trinn 1:. Definer Layout
Opprett en ny layout XML fil som heter activity_main.xml. Oppsettet bør ha en SurfaceView for å vise forhåndsvisning bilder tatt av kameraet. Hvis du vil, kan du også legge til en TextView å vise innholdet av QR-koder API oppdager
Etter å ha brukt en RelativeLayout å posisjonere både widgets, bør oppsettet XML fil se omtrent slik ut:.
? < xml version = "1.0" encoding = "UTF-8" > < RelativeLayout xmlns:? android = "http://schemas.android.com/apk/res/android" android: layout_width = "match_parent" android: layout_height = "match_parent" android: padding = "16dp" > < SurfaceView android: layout_width = "640px" android: layout_height = "480px" android: layout_centerVertical = "true" android: layout_alignParentLeft = "true" android: id = "+ id /camera_view" /> < TextView android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: id = "+ id /code_info" android: layout_toRightOf = "+ id /camera_view" android: Tekststørrelse = "20sp" android: layout_marginLeft = "16dp" android: text = "Ingenting å lese." android: layout_alignParentTop = "true" /> < /RelativeLayout >
Trinn 2: Lag aktivitets
Opprett en ny Java klasse kalt MainActivity.java. Gjør det til en underklasse av aktivitet og overstyre sin onCreate metoden. Inne i onCreate metoden, ring setContentView å bruke oppsettet du opprettet i forrige trinn. Deretter bruker findViewById å få referanser til widgets er definert i oppsettet
setContentView (R.layout.activity_main);. CameraView = (SurfaceView) findViewById (R.id.camera_view); barcodeInfo = (TextView) findViewById (R. id.code_info);
Hvis du vil hente en strøm av bilder fra kameraet i enheten og vise dem i SurfaceView, opprette en ny forekomst av CameraSource klassen bruker CameraSource.Builder. Fordi CameraSource trenger en BarcodeDetector, opprette en bruker BarcodeDetector.Builder klassen. Hvis du vil, kan du justere dimensjonene forhåndsvisning av kameraet bruker setRequestedPreviewSize metoden
barcodeDetector = nye BarcodeDetector.Builder (denne) .setBarcodeFormats (Barcode.QR_CODE) att bygga ();. CameraSource = new CameraSource .Builder (dette , barcodeDetector) .setRequestedPreviewSize (640, 480) att bygga ();
Deretter legger du en tilbakeringing til SurfaceHolder av SurfaceView slik at du vet når du kan begynne å tegne de forhåndsvisning rammer. Tilbakeringing bør implementere SurfaceHolder.Callback grensesnittet.
CameraView.getHolder (). AddCallback (ny SurfaceHolder.Callback () {Override public void surfaceCreated (SurfaceHolder holder) {}Override public void surfaceChanged (SurfaceHolder holder, int format , int bredde, int høyde) {}Override public void surfaceDestroyed (SurfaceHolder holder) {}});
Inne i surfaceCreated metoden, kaller starten metoden i CameraSource å begynne å tegne de forhåndsvisning rammer. Fordi starten metoden forventer at du skal håndtere en IOException, bør du kalle det fra innsiden av en prøve ... catch-blokken
try {cameraSource.start (cameraView.getHolder ());}. Fangst (IOException ie) {Log. e ("CAMERA SOURCE", ie.getMessage ());}
På samme måte inne i surfaceDestroyed metoden, ring stopp metoden i CameraSource å slutte å tegne forhåndsvisnings rammer
cameraSource.stop ();.
Din aktivitet er nesten klar. Men du fortsatt trenger å fortelle BarcodeDetector hva den skal gjøre når den oppdager en QR-kode. Opprett en forekomst av en klasse som implementerer Detector.Processor grensesnitt og gi det til setProcessor metoden i BarcodeDetector. Android Studio vil automatisk generere stubber for metodene i grensesnittet
barcodeDetector.setProcessor (ny Detector.Processor. ≪ Barcode > () {Override public void utgivelsen () {}Override public void receiveDetections (Detector.Detections < Barcode > påvisninger) {}});
Inne i receiveDetections metoden, få SparseArray av Barcode gjenstander ved å ringe getDetectedItems metoden i Detector.Detections klassen. Du kan nå skrive inn koden for å gjøre noe med de detekterte QR-koder, fordi jeg allerede har vist deg hvordan du arbeider med SpareArray objekter tidligere i denne opplæringen.
Her er hvordan du kan vise QR-koden er displayValue i TextView :
endelige SparseArray < Barcode > strekkoder = detections.getDetectedItems (); if (! barcodes.size () = 0) {barcodeInfo.post (ny kjørbart () {//Bruk stillingen metoden i TextView public void run () {barcodeInfo.setText (//oppdatere TextView barcodes.valueAt (0) .displayValue);}});}
Legg merke til at du bør legge samtalen til setText metode inne i en samtale på innlegget metoden i TextView, fordi receiveDetections ikke kjøres på UI tråden. Unnlate å gjøre dette vil føre til en runtime error.
Du kan nå kompilere og kjøre programmet ditt. Peke enhetens kamera til en QR-kode, og du bør være i stand til å se QR-kode innholdet umiddelbart.
Konklusjon
I denne opplæringen, lært deg hvordan du bruker den mobile visjon API for å lese QR koder fra statiske bilder samt fra live-kamera bekker. Selv om vi bare jobbet med QR-koder i denne opplæringen, kan du også bruke API for å lese andre populære strekkode formater som UPC-A og EAN-13.
Hvis du vil vite mer om mobil visjon API, jeg anbefale å besøke API dokumentasjon. Anmeldelser