Lesen von QR-Codes mithilfe der Mobile Vision-API

Einführung

QR-Codes sind in den letzten Jahren allgegenwärtig geworden. Ich bin sicher, Sie haben eine in einer Zeitungsanzeige oder auf einer Werbetafel gesehen. Nach Laien sind QR-Codes wie alle anderen Barcodes Bilder, die von Maschinen gelesen werden können. Normalerweise stellen sie eine kleine Zeichenfolge dar, beispielsweise eine verkürzte URL oder eine Telefonnummer. Hier ist ein Beispiel-QR-Code, der die URL der Tuts + -Homepage enthält:

Im Gegensatz zu herkömmlichen Barcodes, die spezielle Hardware benötigen, können QR-Codes von jedem Smartphone mit einer anständigen Kamera genau gelesen werden.

Die neueste Version des Google Play-Services-SDK umfasst die Mobile-Vision-API, mit der Android-Entwickler unter anderem Apps erstellen können, die QR-Codes in Echtzeit erkennen und lesen können. In diesem Tutorial werde ich Ihnen beim Einstieg helfen.

Voraussetzungen

Um diesem Tutorial zu folgen, benötigen Sie:

  • die neueste Version von Android Studio
  • ein Android-Gerät mit einer Kamera

1. Installieren des Google Play Services SDK

Bevor Sie die Mobile-Vision-API in Ihrer App verwenden, sollten Sie das Google Play-Services-SDK 7.8 als a hinzufügen kompilieren Abhängigkeit in Ihrem App Modul build.gradle.

groovy kompilieren 'com.google.android.gms: play-services: 7.8.0'

Wenn Sie die Taste drücken Jetzt synchronisieren Wenn Sie auf die Schaltfläche klicken, wird ein Fehler angezeigt, der folgendermaßen aussieht:

Drücke den Repository installieren und Projekt synchronisieren Link zum Installieren des SDK.

2. Bearbeiten des App-Manifests

Fügen Sie Ihrer App die folgende Zeile hinzu AndroidManifest.xml So installieren Sie die Barcode-Erkennungsbibliotheken automatisch auf den Geräten, die versuchen, Ihre App auszuführen:

"xml

"

Da Sie die QR-Codes mit der Kamera des Geräts erfassen, sollten Sie außerdem das anfordern android.permission.CAMERA Genehmigung.

"xml

"

3. Lesen eines QR-Codes von einem Foto

Lassen Sie uns nun einen Code schreiben, der einen QR-Code aus einem in Ihrer App gespeicherten Foto lesen kann Vermögenswerte Mappe. Ich werde das Foto nennen myqrcode.jpg. Wenn Sie keine Fotos mit QR-Codes zur Hand haben, können Sie Fotos von Flickr erhalten.

Schritt 1: Konvertieren Sie das Foto in a Bitmap

Weil die Mobile-Vision-API a benötigt Bitmap Als Eingabe sollten Sie Ihr Foto zunächst in eine konvertieren Bitmap. Öffnen Sie dazu das Foto mit öffnen Methode der Vermögensverwalter Klasse und übergeben die Eingabestrom kehrte zum zurück decodeStream Methode von BitmapFactory. Um es einfach zu halten, tun Sie es in der onCreate Methode Ihrer Aktivität.

java Bitmap myQRCode = BitmapFactory.decodeStream (getAssets (). open ("myqrcode.jpg"));

Schritt 2: Erstellen Sie einen Barcode-Detektor

Um QR-Codes (und andere Arten von Barcodes) zu erkennen, sollten Sie eine Instanz von verwenden BarcodeDetector Klasse. Der folgende Code zeigt Ihnen, wie Sie mit erstellen BarcodeDetector.Builder:

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

Beachten Sie, dass der Detektor standardmäßig Barcodes aller unterstützten Formate erkennt. Ich habe das benutzt setBarcodeFormats Methode, um explizit anzugeben, dass der Detektor nur QR-Codes erkennen soll.

Schritt 3: Lesen Sie den QR-Code

Benutzen Frame.Builder ein erstellen Rahmen Verwendung der Bitmap Sie haben früher erstellt.

java Frame myFrame = new Frame.Builder () .setBitmap (myQRCode) .build ();

Ruf den erkennen Methode der BarcodeDetector ein generieren SparseArray enthält alle QR-Codes der BarcodeDetector in Ihrem Foto erkannt.

Java SparseArray Barcodes = BarcodeDetector.detect (myFrame);

Jeder Artikel der SparseArray enthält ein Barcode Objekt. Um den rohen Inhalt des QR-Codes abzurufen, können Sie den verwenden Barcode Objekt ist Rohwert Feld. Ich schlage jedoch vor, dass Sie das besser lesbare verwenden displayValue stattdessen Feld. Hier ist ein Code, der den Inhalt des ersten QR-Codes ausgibt, den die API erkannt hat:

"java // Prüfen Sie, ob mindestens ein Barcode erkannt wurde, wenn (barcodes.size ()! = 0)

// Die Nachricht des QR-Codes drucken Log.d ("Daten meines QR-Codes", barcodes.valueAt (0) .displayValue);  "

Wenn Sie Ihre ausführen Aktivität Jetzt sollten Sie die Nachricht im QR-Code Ihres Fotos sehen können.

4. Lesen eines QR-Codes mit der Kamera

Mit der Mobile Vision-API können Sie mit der Kamera des Geräts in Echtzeit Barcodes erkennen und lesen. Lass uns ein neues erstellen Aktivität das tut genau das.

Schritt 1: Definieren Sie das Layout

Erstellen Sie eine neue Layout-XML-Datei mit dem Namen activity_main.xml. Das Layout sollte eine SurfaceView um die von der Kamera aufgenommenen Vorschaubilder anzuzeigen. Wenn Sie möchten, können Sie auch eine hinzufügen Textvorschau um den Inhalt der QR-Codes anzuzeigen, die die API erkennt.

Nach der Verwendung eines RelativesLayout Um beide Widgets zu positionieren, sollte die Layout-XML-Datei in etwa wie folgt aussehen:

"xml

"

Schritt 2: Erstellen Sie die Aktivität

Erstellen Sie eine neue Java-Klasse mit dem Namen MainActivity.java. Mach eine Unterklasse von Aktivität und überschreiben seine onCreate Methode. In der onCreate Methode aufrufen setContentView um das Layout anzuwenden, das Sie im vorherigen Schritt erstellt haben. Als nächstes verwenden findViewById um Verweise auf die im Layout definierten Widgets zu erhalten.

"java setContentView (R.layout.activity_main);

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

Abrufen eines Bildstroms von der Kamera des Geräts und Anzeigen dieser in der Kamera SurfaceView, Erstellen Sie eine neue Instanz von CameraSource Klasse mit CameraSource.Builder. Weil der CameraSource braucht ein BarcodeDetector, Erstellen Sie eine mit BarcodeDetector.Builder Klasse. Wenn Sie möchten, können Sie die Abmessungen der Kameravorschau mithilfe von anpassen setRequestedPreviewSize Methode.

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

cameraSource = new CameraSource .Builder (dieser BarcodeDetector) .setRequestedPreviewSize (640, 480) .build (); "

Fügen Sie als Nächstes einen Rückruf hinzu SurfaceHolder des SurfaceView damit Sie wissen, wann Sie mit dem Zeichnen der Vorschaubilder beginnen können. Der Rückruf sollte das implementieren SurfaceHolder.Callback Schnittstelle.

"java cameraView.getHolder (). addCallback (new SurfaceHolder.Callback () @Override public void surfaceCreated (Inhaber von SurfaceHolder)

@Override public void surfaceChanged (SurfaceHolder-Halter, int-Format, int. Breite, int. Höhe)  @Override public void surfaceDestroyed (SurfaceHolder-Halter) ;

In der surfaceCreated Methode, rufen Sie die Start Methode der CameraSource um die Vorschaubilder zu zeichnen. Weil der Start Methode erwartet, dass Sie mit einem IOException, Sie sollten es von innen anrufen versuche es… fangen Block.

java try cameraSource.start (cameraView.getHolder ()); catch (IOException dh) Log.e ("CAMERA SOURCE", dh.getMessage ());

Ebenso innerhalb der oberflächeZerstört Methode, rufen Sie die halt Methode der CameraSource um das Zeichnen der Vorschaubilder zu beenden.

java cameraSource.stop ();

Ihre Aktivität ist fast fertig. Sie müssen dem aber trotzdem mitteilen BarcodeDetector Was soll er tun, wenn er einen QR-Code erkennt? Erstellen Sie eine Instanz einer Klasse, die das implementiert Detektor.Prozessor Schnittstelle und übergeben Sie es an die setProcessor Methode der BarcodeDetector. Android Studio generiert automatisch Stubs für die Methoden der Benutzeroberfläche.

"java barcodeDetector.setProcessor (neuer Detector.Processor() @Override public void release ()

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

In der receiveDetections Methode, hol die SparseArray von Barcode Objekte durch Aufrufen der getDetectedItems Methode der Detector.Detections Klasse. Sie können jetzt den Code schreiben, um etwas mit den erkannten QR-Codes zu tun, da ich Ihnen bereits gezeigt habe, wie Sie damit arbeiten SpareArray Objekte früher in diesem Tutorial.

So zeigen Sie die QR-Codes an displayValue in dem Textvorschau:

"java final SparseArray barcodes = detections.getDetectedItems ();

if (barcodes.size ()! = 0) barcodeInfo.post (new Runnable () // Verwenden Sie die Post-Methode der öffentlichen void runView-Methode von vView (barcodeInfo.setText) ) .displayValue);); "

Beachten Sie, dass Sie den Anruf in das Telefon einbetten sollten Text setzen Methode innerhalb eines Aufrufs an die Post Methode der Textvorschau, da receiveDetections wird nicht auf dem UI-Thread ausgeführt. Andernfalls führt dies zu einem Laufzeitfehler.

Sie können Ihre App jetzt kompilieren und ausführen. Richten Sie die Kamera Ihres Geräts auf einen QR-Code und Sie sollten den Inhalt des QR-Codes sofort sehen können.

Fazit

In diesem Lernprogramm haben Sie gelernt, wie Sie mithilfe der Mobile Vision-API QR-Codes sowohl von statischen Bildern als auch von Live-Kamerastreams lesen können. Obwohl in diesem Lernprogramm nur QR-Codes verwendet wurden, können Sie die API auch zum Lesen anderer gängiger Barcode-Formate wie UPC-A und EAN-13 verwenden.

Um mehr über die Mobile Vision-API zu erfahren, empfehle ich die Dokumentation der API.