Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
Black Friday: -25€ dès 75€ sur les livres en ligne, vidéos... avec le code BWEEK25. J'en profite !
  1. Livres et vidéos
  2. Android
  3. La technologie NFC
Extrait - Android Guide de développement d'applications Java pour Smartphones et Tablettes (4e édition)
Extraits du livre
Android Guide de développement d'applications Java pour Smartphones et Tablettes (4e édition) Revenir à la page d'achat du livre

La technologie NFC

Introduction

Outre les connexions Wi-Fi et Bluetooth, de plus en plus d’appareils intègrent désormais la prise en charge de la technologie NFC. Cette technologie est en première ligne pour les systèmes de paiement sans contact et jouera certainement un rôle majeur pour l’Internet des objets.

Ce chapitre présente les points clés de la technologie NFC, puis précise le mécanisme de prise en charge des tags NFC sur les systèmes Android, et enfin, aborde la lecture et l’écriture de tag NFC.

Présentation de NFC

Le sigle NFC signifie Near Field Communication (communication en champ proche). Une communication NFC est sans fil, de faible portée (de l’ordre de quelques centimètres). Elle est caractérisée par l’absence d’appareillage entre l’émetteur et le récepteur (contrairement au Bluetooth, par exemple), ainsi que par la rapidité de l’établissement de la communication.

1. Les scénarios d’utilisation du NFC

La portée très faible est normalement garante que la communication est initiée par l’utilisateur de l’appareil, celui-ci devant poser son appareil sur le tag lui-même. Cela permet d’introduire un premier niveau de sécurité.

La technologie NFC a été pensée pour trois types d’utilisation :

  • La lecture par l’appareil de tags NFC contenant une information spécifique (adresse d’un site web, numéro de téléphone, fiche contact, etc.). Les tags de type "smart-poster" sont un exemple d’utilisation : une affiche, ou tout autre élément, présentant un événement comporte un tag NFC qui enregistrera l’adresse de l’événement, ou donnera accès à son site Internet.

  • La communication entre appareils NFC. Dans ce cas, la communication NFC est vue comme une initiatrice...

Prise en charge du NFC

Tous les appareils fonctionnant sous Android ne prennent pas en charge la technologie NFC. Avant d’initier une communication NFC dans une application, il est donc plus que nécessaire de vérifier si la technologie est disponible sur l’appareil de l’utilisateur. Ensuite, il faut "informer" l’appareil hôte que l’application est capable de prendre en charge une communication NFC.

1. Utiliser avec un émulateur

Même si les tests en conditions réelles sont indispensables, il est pratique de pouvoir utiliser, durant les différentes phases de développement, un émulateur Android.

Pour développer des fonctionnalités NFC, en plus de l’émulateur Android classique, le développeur doit avoir recours à un mécanisme d’émulation de cartes/tags NFC. Le projet Open NFC, soutenu par la société Inside Secure (https://www.insidesecure.com), fournit gratuitement un tel émulateur.

Pour faire fonctionner l’émulation, il faut installer trois éléments :

  • Une image de terminal Android.

  • L’application ConnectionCenter, qui gère la connexion entre l’émulateur de tag et l’émulateur Android.

  • L’application NFC Controller Simulation, qui simule les tags NFC.

Le processus d’installation ainsi que les sources des éléments...

Découverte d’un tag NFC

Suivant le contenu d’un tag NFC, le système Android encapsule les informations dans des intents d’actions différentes. À chaque action d’intent correspond, pour l’application, un filtre d’intent spécifique.

Les intents créés par le système suivent une hiérarchie, qui va du plus au moins spécialisé.

  • Niveau 1 : si le tag contient un message au format NDEF, le système lit le premier enregistrement du message, pour tenter d’extraire un type MIME ou une URI. Si cette extraction est fructueuse, c’est l’application qui prend en charge le type MIME, ou l’application ciblée par l’URI qui est lancée. L’intent correspondant a pour action ACTION_NDEF_DISCOVERED.

  • Niveau 2 : si le tag ne contient pas de message au format NDEF, ou si aucune application n’est trouvée à l’étape 1, le système sélectionne l’application en tenant compte des technologies de tag déclarées comme prises en charge par chaque application, au niveau des filtres d’intent. Le système crée dans ce cas un intent d’action ACTION_TECH_DISCOVERED.

  • Niveau 3 : enfin, si aucune application n’a pu être sélectionnée dans les deux étapes précédentes, un intent de type ACTION_TAG_DISCOVERED est créé, et sera fourni à l’application prenant en charge cette action d’intent.

À charge du développeur de déclarer les filtres d’intent qui correspondent le mieux aux messages pris en charge par son application. En effet, dans le cas où plusieurs applications sont disponibles, le système propose la liste des applications candidates et laisse à l’utilisateur le choix de l’application qui sera lancée.

Il est important pour le développeur de correctement déclarer la prise en charge des tags NFC par son application. Il est en effet capital que l’application soit sélectionnée au plus tôt dans le processus de sélection par le système, sinon le risque est important qu’une autre application soit lancée avant. D’un autre côté, si le développeur déclare prendre en compte une technologie qu’il ne gère...

Lire un tag NFC

La lecture d’un tag NFC intervient après la prise en charge du tag par l’activité. Le tag et son contenu sont fournis à l’activité dans l’intent, qui contient également l’action qui permet de déterminer quel type de message est contenu dans le tag ; il suffit donc de tester la valeur de l’action de l’intent pour savoir quelle méthode utiliser pour déchiffrer le ou les messages.

if(intent.getAction().equals(NfcAdapter.ACTION_NDEF_DISCOVERED)) 
  Log.d(TAG,"Lecture d'un tag NDEF"); 
else  
if(intent.getAction().equals(NfcAdapter.ACTION_TECH_DISCOVERED)) 
  Log.d(TAG,"Lecture d'un tag TECH"); 

Nous allons voir en détail la lecture des différents types de messages NDEF.

1. Déterminer le contenu d’un tag NDEF

Dans le cas d’un tag contenant des messages NDEF, la lecture se fait en récupérant sous forme de ParcelableArrayExtra la valeur du parcelable de nom NfcAdapter.EXTRA_NDEF_MESSAGES contenu dans l’intent, puis en convertissant chaque élément du tableau en objet de type NdefMessage (il ne faut pas oublier qu’un tag NDEF peut contenir plusieurs messages au format NDEF).

Parcelable[] parcelableNedfMessages =  
intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); 
 
if(parcelableNedfMessages==null) 
  return; 
 
NdefMessage[] messages =  
  new NdefMessage[parcelableNedfMessages.length]; 
 
for(int i =0;i<parcelableNedfMessages.length;i++)  
  messages[i] = (NdefMessage)parcelableNedfMessages[i]; 

Chaque NdefMessage extrait contient un ou plusieurs NdefRecord, qui sont les entités portant les messages à proprement parler.

Pour chaque objet NdefRecord, le message est contenu sous forme d’un tableau d’octets, appelé Payload, auquel on accède avec la méthode getPayload() de l’objet NdefRecord. Il faut convertir ces données, selon le format de l’enregistrement NdefRecord. Pour cela, l’objet NdefRecord expose les méthodes : getTnf(), qui renvoie le format du NdefRecord, et getType(), qui renvoie le sous-type dans le cas où le type de NdefRecord est TNF_WELL_KNOWN.

L’API 16 d’Android introduit plusieurs méthodes pour la classe NdefRecord, qui facilitent...

Écrire un tag NFC

Comme pour la lecture, l’écriture d’un tag intervient classiquement après la prise en charge du tag détecté par l’intent.

Il est fortement recommandé de ne créer que des messages NFC au format NdefMessage, celui-ci étant, on l’a vu précédemment, indépendant de la technologie du tag sous-jacent.

L’écriture d’un tag suit la structure de l’objet de type NdefMessage : le message comporte un ou plusieurs enregistrements (objets de type NdefRecord), eux-mêmes pouvant être de types distincts.

L’écriture du tag est faite par un objet de type android.nfc.tech.Ndef, qui fournit des méthodes de haut niveau pour l’écriture.

Une instance de Ndef est obtenue en utilisant la méthode statique get(Tag) de la classe Ndef. Le tag passé en paramètre est l’objet que l’intent fournit suite à la découverte du tag.

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
Ndef ndef = Ndef.get(tag); 
// ... écriture du tag 

La méthode get(tag) peut renvoyer null, dans le cas où le tag présenté ne supporte par la technologie NDEF.

L’écriture en elle-même est très simple : il suffit d’initialiser l’opération d’écriture à l’aide de la méthode connect(), d’écrire le tag avec la méthode writeNdefMessage(NdefMessage) et de fermer la connexion en appelant la méthode close().

Try { 
   ndef.connect(); 
   ndef.writeNdefMessage(message); 
   ndef.close(); 
} catch (IOException e) { 
     e.printStackTrace(); 
} 

Ces méthodes ne doivent pas être appelées à partir du processus principal.

Nous allons maintenant étudier en détail la construction du NdefMessage, objet passé en paramètre de la méthode writeNdefMessage().

Selon l’API Android visée, il sera plus ou moins complexe de construire les enregistrements intégrés dans le message. L’API 14 apporte un helper statique permettant de créer un tag de type URI, et l’API 16 ajoute également...