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.
Um diesem Tutorial zu folgen, benötigen Sie:
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.
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
"
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.
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"));
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.
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
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.
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.
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
"
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 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
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.
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.