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ör att följa denna handledning behöver du:
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.
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
"
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.
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"));
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.
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
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.
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.
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
"
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 receiveDetections (Detector.Detectionsdetekteringar) ); "
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
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.
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.