Les QR-koder ved hjelp av API for mobilvisjon

Introduksjon

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.

Forutsetninger

For å følge denne opplæringen må du:

  • den nyeste versjonen av Android Studio
  • en Android-enhet med et kamera

1. Installere SDK for Google Play Services

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.

2. Redigering av App Manifest

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

"

3. Lesing av 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 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.

Trinn 1: Konverter bildet til en 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"));

Trinn 2: Lag en strekkode detektor

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.

Trinn 3: Les QR-koden

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 strekkoder = barcodeDetector.detect (myFrame);

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.

4. Lesing av en QR-kode ved hjelp av kameraet

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.

Trinn 1: Definer utformingen

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

"

Trinn 2: Opprett 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() @Overtrid offentlig tomgangsløsning ()

@Override public void receiveDetections (Detector.Detections detekteringer) ); "

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 strekkoder = deteksjoner.getDetectedItems ();

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.

Konklusjon

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.