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.
Pour suivre ce tutoriel, vous aurez besoin de:
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.
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
"
É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.
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"));
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.
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
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.
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.
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
"
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 null receiveDetections (Detector.Detectionsdé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
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..
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..