Lecture de codes QR à l'aide de l'API Mobile Vision

introduction

Les codes QR sont devenus omniprésents ces dernières années. Je suis sûr que vous en avez vu un dans une publicité dans un journal ou sur un babillard. En termes simples, les codes QR, comme tous les autres codes à barres, sont des images conçues pour être lues par des machines. Ils représentent généralement une petite chaîne, telle qu'une URL raccourcie ou un numéro de téléphone. Voici un exemple de code QR contenant l'URL de la page d'accueil de Tuts +:

Contrairement aux codes à barres traditionnels, qui nécessitent du matériel spécialisé, les codes QR peuvent être lus avec précision par tout smartphone doté d'un appareil photo de qualité.

La dernière version du Kit de développement logiciel (SDK) de Google Play comprend l’API de vision mobile, qui permet notamment aux développeurs Android de créer facilement des applications capables de détecter et de lire les codes QR en temps réel. Dans ce tutoriel, je vais vous aider à démarrer avec.

Conditions préalables

Pour suivre ce tutoriel, vous aurez besoin de:

  • la dernière version d'Android Studio
  • un appareil Android avec une caméra

1. Installation du SDK des services Google Play

Avant d’utiliser l’API de vision mobile dans votre application, vous devez ajouter le SDK 7.8 des services Google Play en tant que compiler la dépendance dans votre app modules build.gradle.

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

Lorsque vous appuyez sur le Synchroniser maintenant bouton, vous verrez une erreur qui ressemble à ceci:

Clique le Installer le référentiel et synchroniser le projet lien pour installer le SDK.

2. Modification du manifeste de l'application

Ajoutez la ligne suivante à votre application AndroidManifest.xml pour installer automatiquement les bibliothèques de détection de code à barres sur les appareils qui essaient d’exécuter votre application:

"xml

"

De plus, comme vous allez utiliser la caméra de l'appareil pour capturer les codes QR, vous devez demander à android.permission.CAMERA autorisation.

"xml

"

3. Lecture d'un code QR à partir d'une photo

Écrivons maintenant un code capable de lire un code QR à partir d'une photo stockée dans votre application. les atouts dossier. Je vais nommer la photo myqrcode.jpg. Si vous n'avez pas de photos contenant des codes QR à portée de main, vous pouvez en obtenir de Flickr.

Étape 1: convertissez la photo en un Bitmap

Parce que l'API de vision mobile a besoin d'un Bitmap comme entrée, vous devez d’abord convertir votre photo en un Bitmap. Pour ce faire, ouvrez la photo à l’aide de la touche ouvrir méthode du Gestionnaire d'actifs classe et passe le Flux d'entrée retourné à la decodeStream méthode de BitmapFactory. Pour rester simple, faites-le à l'intérieur du onCreate méthode de votre Activité.

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

Étape 2: Créer un détecteur de code à barres

Pour détecter les codes QR (et autres types de codes à barres), vous devez utiliser une instance du BarcodeDetector classe. Le code suivant vous montre comment en créer un en utilisant BarcodeDetector.Builder:

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

Notez que le détecteur détectera par défaut les codes à barres de tous les formats pris en charge. J'ai utilisé le setBarcodeFormats méthode pour spécifier explicitement que le détecteur ne doit détecter que les codes QR.

Étape 3: lisez le code QR

Utilisation Frame.Builder créer un Cadre en utilisant le Bitmap vous avez créé plus tôt.

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

Appeler le détecter méthode du BarcodeDetector générer un SparseArray contenant tous les codes QR les BarcodeDetector détecté dans votre photo.

java SparseArray codes à barres = barcodeDetector.detect (myFrame);

Chaque élément du SparseArray contient un code à barre objet. Pour récupérer le contenu brut du code QR, vous pouvez utiliser le code à barre objets valeur brute champ. Cependant, je vous suggère d'utiliser le plus facile à lire displayValue champ à la place. Voici un code qui affiche le contenu du premier code QR détecté par l'API:

"java // Vérifie si au moins un code-barres a été détecté si (code-barres.size ()! = 0)

// Imprime le message du code QR Log.d ("Données de mon code QR", codes à barres.valueAt (0) .displayValue);  "

Si vous courez votre Activité maintenant, vous devriez pouvoir voir le message contenu dans le code QR de votre photo.

4. Lecture d'un code QR à l'aide de l'appareil photo

L'API de vision mobile facilite également la détection et la lecture de codes à barres à l'aide de la caméra de votre appareil en temps réel. Créons un nouveau Activité ça fait juste ça.

Étape 1: Définir la mise en page

Créez un nouveau fichier XML de mise en page appelé activity_main.xml. La mise en page doit avoir un SurfaceView afin d’afficher les images d’aperçu capturées par la caméra. Si vous le souhaitez, vous pouvez également ajouter un Affichage afficher le contenu des codes QR détectés par l'API.

Après avoir utilisé un Disposition relative Pour positionner les deux widgets, le fichier XML de présentation doit ressembler à ceci:

"xml

"

Étape 2: Créez le Activité

Créez une nouvelle classe Java appelée MainActivity.java. Faites-en une sous-classe de Activité et remplacer sa onCreate méthode. À l'intérieur de onCreate méthode, appel setContentView appliquer la mise en page créée à l'étape précédente. Ensuite, utilisez findViewById pour obtenir des références aux widgets définis dans la mise en page.

"java setContentView (R.layout.activity_main);

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

Pour extraire un flux d’images de la caméra du périphérique et les afficher dans le SurfaceView, créer une nouvelle instance du CameraSource classe utilisant CameraSource.Builder. Parce que le CameraSource a besoin d'un BarcodeDetector, en créer un en utilisant le BarcodeDetector.Builder classe. Si vous le souhaitez, vous pouvez ajuster les dimensions de l'aperçu de la caméra à l'aide du bouton setRequestedPreviewSize méthode.

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

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

Ensuite, ajoutez un rappel au SurfaceHolder du SurfaceView afin que vous sachiez quand vous pouvez commencer à dessiner les images de prévisualisation. Le rappel doit implémenter la SurfaceHolder.Callback interface.

"java cameraView.getHolder (). addCallback (nouveau SurfaceHolder.Callback () @Override public vide surfaceCreated (titulaire de SurfaceHolder)

@Override public vide surfaceChanged (titulaire SurfaceHolder, format int, largeur int, hauteur hauteur)  @Override public vide surfaceDestroyed (titulaire SurfaceHolder) ); "

À l'intérieur de surfaceCréée méthode, appelez le début méthode du CameraSource pour commencer à dessiner les images de prévisualisation. Parce que le début méthode attend de vous gérer un IOException, vous devriez l'appeler de l'intérieur d'un essayer… attraper bloc.

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

De même, à l'intérieur du surfaceDestroyed méthode, appelez le Arrêtez méthode du CameraSource arrêter de dessiner les images de prévisualisation.

java cameraSource.stop ();

Votre Activité est presque prêt. Cependant, vous devez toujours dire au BarcodeDetector Que doit-il faire lorsqu'il détecte un code QR? Créer une instance d'une classe qui implémente le Detector.Processor interface et le passer à la setProcessor méthode du BarcodeDetector. Android Studio générera automatiquement des stubs pour les méthodes de l'interface.

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

@Override public null receiveDetections (Detector.Detections détections) ); "

À l'intérieur de recevoirDétections méthode, obtenir le SparseArray de code à barre objets en appelant le getDetectedItems méthode du Détecteur.Detections classe. Vous pouvez maintenant écrire le code pour faire quelque chose avec les codes QR détectés, car je vous ai déjà montré comment travailler avec SpareArray objets plus tôt dans ce tutoriel.

Voici comment afficher le code QR displayValue dans le Affichage:

"java final SparseArray codes à barres = detections.getDetectedItems ();

if (barcodes.size ()! = 0) barcodeInfo.post (new Runnable () // Utilisez la méthode de publication du texte TextView public void run () barcodeInfo.setText (// Met à jour le code barres TextView.valueAt (0 ) .displayValue);); "

Notez que vous devez intégrer l’appel au Définir le texte méthode à l'intérieur d'un appel à la poster méthode du Affichage, parce que recevoirDétections ne fonctionne pas sur le thread d'interface utilisateur. Sinon, cela entraînera une erreur d'exécution.

Vous pouvez maintenant compiler et exécuter votre application. Pointez la caméra de votre appareil vers un code QR et vous devriez pouvoir voir le contenu du code QR immédiatement..

Conclusion

Dans ce didacticiel, vous avez appris à utiliser l'API de vision mobile pour lire des codes QR à partir d'images statiques et de flux de caméras en direct. Même si nous avons uniquement utilisé des codes QR dans ce didacticiel, vous pouvez également utiliser l'API pour lire d'autres formats de codes à barres populaires tels que UPC-A et EAN-13..

Pour en savoir plus sur l'API de vision mobile, je vous recommande de consulter la documentation de l'API..