Läsa QR-koder Använda mobilvisions API

Introduktion

QR-koder har blivit allestädes närvarande de senaste åren. Jag är säker på att du har sett en i en tidningsannons eller på en skylt. I lekman är QR-koder som alla andra streckkoder bilder som är avsedda att läsas av maskiner. Vanligtvis representerar de en liten sträng, till exempel en förkortad URL eller ett telefonnummer. Här är en samplings QR-kod som innehåller URL: n för Tuts + hemsida:

Till skillnad från traditionella streckkoder, som behöver specialiserad hårdvara, kan QR-koder läsas noggrant av någon smartphone med en anständig kamera.

Den senaste versionen av Google Play-tjänsterna SDK innehåller mobilvisions API som bland annat gör det enkelt för Android-utvecklare att skapa appar som kan identifiera och läsa QR-koder i realtid. I denna handledning kommer jag att hjälpa dig att komma igång med det.

förutsättningar

För att följa denna handledning behöver du:

  • den senaste versionen av Android Studio
  • en Android-enhet med en kamera

1. Installera SDK för Google Play Services

Innan du använder mobilvisnings API i din app bör du lägga till Google Play-tjänsterna SDK 7.8 som en sammanställa beroende i din app modulens build.gradle.

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

När du trycker på Synkronisera nu knappen visas ett fel som ser ut så här:

Klicka på Installera arkiv och synkroniseringsprojekt länk för att installera SDK.

2. Redigering av App Manifest

Lägg till följande rad i din app AndroidManifest.xml att automatiskt installera streckkodsdetekteringsbiblioteken på enheter som försöker köra din app:

"xml

"

Dessutom, som du kommer att använda enhetens kamera för att fånga QR-koderna, bör du begära android.permission.CAMERA lov.

"xml

"

3. Läser en QR-kod från ett foto

Låt oss nu skriva en kod som kan läsa en QR-kod från ett foto som lagrats i din app tillgångar mapp. Jag kommer att namnge fotot myqrcode.jpg. Om du inte har några foton som innehåller QR-koder är det bra att du kan hämta några från Flickr.

Steg 1: Konvertera fotot till ett Bitmap

Eftersom mobilvisnings API behöver en Bitmap Som inmatning bör du först konvertera ditt foto till en Bitmap. För att göra det, öppna fotot med hjälp av öppna metod för AssetManager klass och passera Input återvände till decodeStream metod av BitmapFactory. För att hålla det enkelt, gör det inuti onCreate metod för din Aktivitet.

Java Bitmap myQRCode = BitmapFactory.decodeStream (getAssets () .öppna ("myqrcode.jpg"));

Steg 2: Skapa en streckkodsdetektor

För att upptäcka QR-koder (och andra typer av streckkoder) ska du använda en instans av BarcodeDetector klass. Följande kod visar hur du skapar en med BarcodeDetector.Builder:

java BarcodeDetector barcodeDetector = new BarcodeDetector.Builder (this) .setBarcodeFormats (Barcode.QR_CODE) .build ();

Observera att detektorn som standard upptäcker streckkoder för alla stödda format. Jag har använt setBarcodeFormats metod för att uttryckligen ange att detektorn endast ska upptäcka QR-koder.

Steg 3: Läs QR-koden

Använda sig av Frame.Builder att skapa en Ram använda Bitmap du skapade tidigare.

Java Frame myFrame = ny Frame.Builder () .setBitmap (myQRCode) .build ();

Ring upptäcka, detektera metod för BarcodeDetector att generera en SparseArray som innehåller alla QR-koderna BarcodeDetector upptäckt i ditt foto.

java SparseArray streckkoder = barcodeDetector.detect (myFrame);

Varje objekt i SparseArray innehåller a Streckkod objekt. För att hämta innehållet i QR-koden kan du använda Streckkod objekt rawValue fält. Men jag föreslår att du använder det enklare att läsa displayValue fält istället. Här är en kod som skriver ut innehållet i den första QR-koden som API: n upptäckte:

"java // Kontrollera om minst en streckkod detekterades om (streckkoder.size ()! = 0)

// Skriv ut QR-kodens meddelande Log.d ("Min QR-kodens data", streckkoder.valueAt (0) .displayValue); "

Om du kör din Aktivitet Nu borde du kunna se meddelandet som finns i ditt foto QR-kod.

4. Läsa en QR-kod med hjälp av kameran

Mobilvisions-API gör det också väldigt lätt för dig att upptäcka och läsa streckkoder med hjälp av enhetens kamera i realtid. Låt oss skapa en ny Aktivitet det gör det bara.

Steg 1: Definiera layouten

Skapa en ny layout XML-fil som heter activity_main.xml. Layouten ska ha en SurfaceView för att visa förhandsvisningsramarna som fångats av kameran. Om du vill kan du också lägga till en Textview för att visa innehållet i QR-koderna som API upptäcker.

Efter användning av a RelativeLayout att placera båda widgetarna ska layout XML-filen se ut så här:

"xml

"

Steg 2: Skapa Aktivitet

Skapa en ny Java-klass som heter MainActivity.java. Gör det till en underklass av Aktivitet och åsidosätta dess onCreate metod. Inuti onCreate metod, ring setContentView att tillämpa den layout du skapade i föregående steg. Använd sedan findViewById för att få referenser till de widgets som definieras i layouten.

"java setContentView (R.layout.activity_main);

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

För att hämta en ström av bilder från enhetens kamera och visa dem i SurfaceView, skapa en ny instans av CameraSource klass med hjälp av CameraSource.Builder. Eftersom det CameraSource behöver a BarcodeDetector, skapa en med hjälp av BarcodeDetector.Builder klass. Om du vill kan du justera dimensionerna för kamerans förhandsvisning med hjälp av setRequestedPreviewSize metod.

"java barcodeDetector = new BarcodeDetector.Builder (this) .setBarcodeFormats (Barcode.QR_CODE) .build ();

cameraSource = new CameraSource. Builder (this, barcodeDetector) .setRequestedPreviewSize (640, 480) .build (); "

Lägg sedan till en återuppringning till SurfaceHolder av SurfaceView så att du vet när du kan börja rita förhandsgranskningsramarna. Återuppringningen ska genomföra SurfaceHolder.Callback gränssnitt.

"java cameraView.getHolder (). addCallback (ny SurfaceHolder.Callback () @Override public void surfaceCreated (SurfaceHolder-hållare)

@Override public void surfaceChanged (SurfaceHolder hållare, int format, int bredd, int höjd)  ​​@Override public void surfaceDestroyed (SurfaceHolder hållare) ; "

Inuti surfaceCreated metod, ringa till Start metod för CameraSource för att börja rita förhandsgranskningsramarna. Eftersom det Start Metoden förväntar dig att hantera en IOException, du borde kalla det från insidan a försök fånga blockera.

java försök cameraSource.start (cameraView.getHolder ()); fånga (IOException dvs) Log.e ("CAMERA SOURCE", dvs.getMessage ());

På samma sätt, inuti surfaceDestroyed metod, ringa till sluta metod för CameraSource för att sluta rita förhandsgranskningsramarna.

java cameraSource.stop ();

Din Aktivitet är nästan redo. Men du måste fortfarande berätta för BarcodeDetector vad det ska göra när det upptäcker en QR-kod. Skapa en instans av en klass som implementerar Detector.Processor gränssnitt och vidarebefordra det till setProcessor metod för BarcodeDetector. Android Studio genererar automatiskt stubbar för metoderna för gränssnittet.

"java barcodeDetector.setProcessor (ny detektor.Processor() @Override public void release ()

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

Inuti receiveDetections metod, få SparseArray av Streckkod objekt genom att ringa getDetectedItems metod för Detector.Detections klass. Du kan nu skriva koden för att göra något med de upptäckta QR-koderna, eftersom jag redan har visat hur du ska arbeta med SpareArray föremål tidigare i denna handledning.

Så här kan du visa QR-koden displayValue i Textview:

"java final SparseArray streckkoder = upptäckter.getDetectedItems ();

if (barcodes.size ()! = 0) barcodeInfo.post (new Runnable () // Använd postmetoden för TextView public void run () barcodeInfo.setText (// Uppdatera TextView barcodes.valueAt (0 ) .displayValue);); "

Observera att du borde bädda in samtalet till setText metod inom ett samtal till posta metod för Textview, därför att receiveDetections körs inte på användargränssnittet. Underlåtenhet att göra det leder till ett runtime-fel.

Du kan nu kompilera och köra din app. Peka enhetens kamera på en QR-kod och du ska kunna se QR-kodens innehåll omedelbart.

Slutsats

I den här handledningen lärde du dig hur du använder mobilvisions API för att läsa QR-koder från statiska bilder och från live-kameraströmmar. Trots att vi bara arbetat med QR-koder i den här handledningen kan du också använda API: n för att läsa andra populära streckkodsformat som UPC-A och EAN-13.

Om du vill veta mer om mobilvisnings API rekommenderar jag att du besöker API: s dokumentation.