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 :
  1. <activity android:name="ScanFileActivity">
  2.   <intent-filter>
  3.     <action android:name="com.google.zxing.client.android.SCAN" />
  4.     <category android:name="android.intent.category.DEFAULT" />
  5.   </intent-filter>
  6. </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.
Vous trouverez les sources des fichiers mentionnés dans cet article ici : http://code.google.com/p/zxing/source/checkout