QR-koder har blitt allestedsnærværende de siste årene. Jeg er sikker på at du har sett en i en avisannonse eller på et billboard. I lekmannens termer er QR-koder, som alle andre strekkoder, bilder som er designet for å bli lest av maskiner. Vanligvis representerer de en liten streng, for eksempel en forkortet URL eller et telefonnummer. Her er en prøve QR-kode som inneholder nettadressen til Tuts + -siden:
I motsetning til tradisjonelle strekkoder, som krever spesialisert maskinvare, kan QR-koder leses nøyaktig av hvilken som helst smarttelefon med et anstendig kamera.
Den nyeste versjonen av Google Play-tjenestene SDK inkluderer mobilvisjon API som blant annet gjør det veldig enkelt for Android-utviklere å lage apper 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.
For å følge denne opplæringen må du:
Før du bruker mobilvisnings-API-en i appen din, bør du legge til Google Play-tjenestene SDK 7.8 som en kompilere
avhengighet i din app modulens build.gradle.
groovy compile 'com.google.android.gms: spill-tjenester: 7.8.0'
Når du trykker på Synkroniser nå knappen, vil du se en feil som ser slik ut:
Klikk på Installer arkiv og synkroniseringsprosjekt lenke for å installere SDK.
Legg til følgende linje i appen din AndroidManifest.xml å installere strekkodens detekteringsbibliotekene automatisk på enhetene som prøver å kjøre appen din:
"xml
"
I tillegg, som du vil bruke enhetens kamera for å fange QR-koder, bør du be om android.permission.CAMERA
tillatelse.
"xml
"
La oss nå skrive noen kode som kan lese en QR-kode fra et bilde som er lagret i appen din eiendeler mappe. Jeg skal nevne bildet myqrcode.jpg. Hvis du ikke har noen bilder som inneholder QR-koder, kan du få noen fra Flickr.
bitmap
Fordi mobilvisnings-API-en trenger en bitmap
Som inngang, bør du først konvertere bildet til en bitmap
. For å gjøre det, åpne bildet ved hjelp av åpen
metode av Kapitalforvalter
klasse og passere Input
returnert til decodeStream
Metode av BitmapFactory
. For å holde det enkelt, gjør det inne i onCreate
metode for din Aktivitet
.
java Bitmap myQRCode = BitmapFactory.decodeStream (getAssets () .åpent ("myqrcode.jpg"));
For å oppdage QR koder (og andre typer strekkoder), bør du bruke en forekomst av BarcodeDetector
klasse. Følgende kode viser hvordan du lager en ved hjelp av BarcodeDetector.Builder
:
java BarcodeDetector barcodeDetector = new BarcodeDetector.Builder (this) .setBarcodeFormats (Barcode.QR_CODE) .build ();
Merk at detektoren vil som standard oppdage strekkoder for alle støttede formater. Jeg har brukt setBarcodeFormats
metode for å spesifisere spesifikt at detektoren bare skal oppdage QR-koder.
Bruk Frame.Builder
å lage en Ramme
bruker bitmap
du opprettet tidligere.
java ramme myFrame = ny Frame.Builder () .setBitmap (myQRCode) .build ();
Ring oppdage
metode av BarcodeDetector
å generere en SparseArray
som inneholder alle QR koder den BarcodeDetector
oppdaget i bildet ditt.
java SparseArray
Hvert element av SparseArray
inneholder a Barcode
gjenstand. For å hente innholdet i QR-koden, kan du bruke Barcode
objektets rawValue
felt. Men jeg foreslår at du bruker det enklere å lese displayValue
feltet i stedet. Her er noen kode som skriver ut innholdet i den første QR-koden APIen oppdaget:
"java // Sjekk om minst én strekkode ble oppdaget hvis (strekkoder.size ()! = 0)
// Skriv ut QR-kodens melding Log.d ("Min QR-kode er data", strekkoder.valueAt (0) .displayValue); "
Hvis du kjører din Aktivitet
Nå bør du kunne se meldingen som er inneholdt i bildet ditt QR-kode.
Mobile Vision API gjør det også veldig enkelt for deg å oppdage og lese strekkoder ved hjelp av enhetens kamera i sanntid. La oss lage en ny Aktivitet
det gjør det bare.
Opprett en ny layout XML-fil kalt activity_main.xml. Oppsettet skal ha en SurfaceView
for å vise forhåndsvisningsrammer fanget av kameraet. Hvis du vil, kan du også legge til en TextView
for å vise innholdet i QR-kodene, registrerer API-en.
Etter bruk av a RelativeLayout
for å plassere begge widgetene, bør layout-XML-filen se slik ut:
"xml
"
Aktivitet
Opprett en ny Java-klasse som heter MainActivity.java. Gjør det til en underklasse av Aktivitet
og overstyr det onCreate
metode. Inne i onCreate
metode, samtale setContentView
å bruke oppsettet du opprettet i forrige trinn. Deretter bruker du findViewById
for å få referanser til widgets definert i oppsettet.
"java setContentView (R.layout.activity_main);
cameraView = (SurfaceView) findViewById (R.id.camera_view); barcodeInfo = (TextView) findViewById (R.id.code_info); "
For å hente en strøm av bilder fra enhetens kamera og vise dem i SurfaceView
, opprett en ny forekomst av CameraSource
klassen bruker CameraSource.Builder
. Fordi det CameraSource
trenger a BarcodeDetector
, opprett en ved hjelp av BarcodeDetector.Builder
klasse. Hvis du vil, kan du justere dimensjonene til forhåndsvisning av kameraet ved hjelp av setRequestedPreviewSize
metode.
"java barcodeDetector = new BarcodeDetector.Builder (dette) .setBarcodeFormats (Barcode.QR_CODE) .build ();
cameraSource = ny CameraSource .Builder (dette, barcodeDetector) .setRequestedPreviewSize (640, 480) .build (); "
Deretter legger du til et tilbakering til SurfaceHolder
av SurfaceView
slik at du vet når du kan begynne å tegne forhåndsvisningsrammer. Tilbakekallingen skal implementere SurfaceHolder.Callback
grensesnitt.
"java cameraView.getHolder (). addCallback (ny SurfaceHolder.Callback () @Override offentlig tomrom overflateCreated (SurfaceHolder holder)
@Override public void surfaceChanged (SurfaceHolder holder, int format, int bredde, int høyde) @Override public void surfaceDestroyed (SurfaceHolder holder) ; ""
Inne i surfaceCreated
metode, ring start
metode av CameraSource
for å begynne å tegne forhåndsvisningsrammer. Fordi det start
Metode forventer at du skal håndtere en IOException
, du bør kalle det fra innsiden a prøv ... fange
blokkere.
java prøv cameraSource.start (cameraView.getHolder ()); catch (IOException ie) Log.e ("CAMERA SOURCE", ie.getMessage ());
På samme måte, inne i surfaceDestroyed
metode, ring Stoppe
metode av CameraSource
å slutte å tegne forhåndsvisningsrammer.
java cameraSource.stop ();
Din Aktivitet
er nesten klar. Men du trenger fortsatt å fortelle BarcodeDetector
hva det skal gjøre når det oppdager en QR-kode. Lag en forekomst av en klasse som implementerer Detector.Processor
grensesnitt og send det til setProcessor
metode av BarcodeDetector
. Android Studio vil automatisk generere stubber for metodene til grensesnittet.
"java barcodeDetector.setProcessor (ny Detector.Processor
@Override public void receiveDetections (Detector.Detectionsdetekteringer) ); "
Inne i receiveDetections
metode, få SparseArray
av Barcode
objekter ved å ringe getDetectedItems
metode av Detector.Detections
klasse. Du kan nå skrive koden for å gjøre noe med de oppdagede QR-koder, fordi jeg allerede har vist deg hvordan du skal jobbe med SpareArray
objekter tidligere i denne opplæringen.
Slik viser du QR-koden displayValue
i TextView
:
"java finalen SparseArray
hvis (barcodes.size ()! = 0) barcodeInfo.post (new Runnable () // Bruk postmetoden til TextView offentlig tomgangsløp () barcodeInfo.setText (// Oppdater TextView barcodes.valueAt (0 ) .displayValue);); "
Legg merke til at du skal legge inn anropet til setText
Metode i en samtale til post
metode av TextView
, fordi receiveDetections
kjører ikke på brukergrensesnittet. Unnlatelse av å gjøre det vil føre til en runtime feil.
Du kan nå kompilere og kjøre appen din. Pek enhetens kamera til en QR-kode, og du bør umiddelbart kunne se QR-kodenes innhold.
I denne opplæringen lærte du hvordan du bruker mobilvisjons-API for å lese QR-koder fra statiske bilder, samt fra levende kamerastrømmer. Selv om vi bare jobbet med QR-koder i denne opplæringen, kan du også bruke API til å lese andre populære strekkodeformater som UPC-A og EAN-13..
For å lære mer om mobilvisnings-API, anbefaler jeg at du besøker API-dokumentasjonen.