La semaine dernière (Tutorial : Scanner et générer des codes QR (2D) sur Android),
nous avons vu comment faire appel à l’application Barcode Scanner afin de
décoder un code QR. Barcode Scanner ne propose que l’appareil photo pour la
capture de l’image du code, ce qui le rend inutilisable sur l’émulateur.
Il est possible en utilisant JMF et une connection TCP/IP émulateur/hôte de
simuler l’appareil photo avec la Webcam (expliqué ici) mais
cela n’est pas pratique pour nos besoins.
La solution retenue est de créer une nouvelle activité de scan qui prend en
paramètre une image présente sur la sdcard. Pour ce faire, il vous faudra :
- Créer une image de sdcard et la monter dans l’émulateur (expliqué ici) ;
- Charger des images de codes QR (format png ou jpeg) sur cette sdcard (voir
lien précédent) ;
- Créer une IntentFilter qui aura la même action que l’activité de scan de
ZXing :
-
<activity android:name="ScanFileActivity">
-
<intent-filter>
-
<action android:name="com.google.zxing.client.android.SCAN"
/>
-
<category android:name="android.intent.category.DEFAULT"
/>
-
</intent-filter>
-
</activity>
Ainsi, lorsqu’une Intent avec cette action sera soumise, le système Android
proposera une liste déroulante des applications capables de les traiter.
- Ensuite il faut créer la classe de l’activité
ScanFileActivity. L’écran de cette activité affichera une liste des images
présentes sur la SDCard et lorsque l’une d’entre elles sera choisie, un objet
QRcodeReader est instancié dans un thread avec les données de l’image
en paramètre. Cette classe de la bibliothèque ZXing prend en paramètre un
objet MonochromeBitmapSource adapté à
la classe Bitmap d’Android via la classe
RGBMonochromeBitmapSource
- La classe ScanFileActivity renvoie un résultat en respectant le même format
que CaptureActivity (classe de Barcode Scanner). Du coup, il n’y aucun
changement à faire sur l’activité principale écrite lors du précédent
article.
Cette nouvelle activité n’étant pas utile sur un vrai téléphone, il faudra
alors commenter sa déclaration dans le fichier AndroidManifest.xml ou l’isoler
dans une application à part.
En conclusion, ce billet montre une fois de plus la force des Intent dans
la plateforme Android.