Page 1 sur 1

[TUTO] Android et NFC : envoi d'un TAG

Message non luPosté: 14 Mar 2011, 08:54
par Viish
Maintenant que vous savez comment lire un TAG, voyons comment en envoyer un. Nous utiliserons pour ce faire l'API 10 du SDK, la version 9 ne supportant pas le Ndef Push.

Note : Il est important de préciser dès à présent que l'utilisation du Ndef Push ne peut être utilisé qu'avec des périphériques compatibles avec l'algorithme de Google. A ce jour et à ma connaissance, il n'y a que les smartphones Android qui l'utilisent.

Je ne sais pas si vous avez remarqué, mais lors du précédent tutoriel à aucun moment nous n'avons utilisé quoi que ce soit qui s'approche de près ou de loin à un objet représentant ou permettant de manipuler le NFC de votre terminal. En effet c'est le système qui s'occupe de détecter, propager et rendre accessibles les données des TAGs à proximité de votre téléphone.
Par contre cette fois-ci nous n'allons pas y couper, il va falloir utiliser l'API NFC. Tout d'abord rajoutons à notre Manifest une ligne pour avoir le droit d'utiliser le capteur NFC.
Code: Select All Code
<uses-permission android:name="android.permission.NFC" />


Astuce : Pour être certain que le téléphone sur lequel votre application va être exécutée dispose d'un capteur NFC, vous pouvez rajouter cette ligne au Manifest pour interdire l'installation de votre application sur un téléphone non compatible.
Code: Select All Code
<uses-feature android:name="android.hardware.nfc" android:required="true" />


Maintenant que nous avons les permissions pour utiliser le capteur NFC, voyons comment récupérer l'objet Java le représentant.
Code: Select All Code
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);

Ce code devant être placé dans votre Activity, this fait ici référence au Context.

Comme nous l'avons vu précédemment, la partie "données" d'un TAG est un NdefMessage, qui est constitué d'un ou plusieurs NdefRecord. Les données transitant sous forme de Bytes, il va falloir encoder notre texte, tout en encodant le Charset pour que l'application en lecture puisse savoir comment décoder les données.
Code: Select All Code
NdefRecord creerRecord(String message)
{
byte[] langBytes = Locale.ENGLISH.getLanguage().getBytes(Charset.forName("US-ASCII"));
byte[] textBytes = message.getBytes(Charset.forName("UTF-8"));
char status = (char) (langBytes.length);
byte[] data = new byte[1 + langBytes.length + textBytes.length];
data[0] = (byte) status;
System.arraycopy(langBytes, 0, data, 1, langBytes.length);
System.arraycopy(textBytes, 0, data, 1 + langBytes.length, textBytes.length);
return new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, new byte[0], data);
}

Puisqu'ici nous encodons du texte simple, j'utilise comme TNF la constante TNF_WELL_KNOW puisqu'on connait le type de données que l'on fait passer, et RTD_TEXT pour le type. Ici je me moque de l'id, mais comme la spécification interdit de passer null comme id, je crée un new byte[0]. Pour finir je passe mes données encodées en bytes.

Utilisons maintenant ce NdefRecord pour créer notre NdefMessage.
Code: Select All Code
NdefMessage creerMessage(NdefRecord record)
{
NdefRecord[] records = new NdefRecord[1];
records[0] = record;
NdefMessage message = new NdefMessage(records);
return message;
}

Maintenant que nous pouvons créer nos messages à faire passer, occupons nous de les envoyer. Nous allons pour cela faire appel à la méthode enableForegroundNdefPush(Context, NdefMessage) de la classe NfcAdapter.

Attention ! Il est obligatoire d'appeler cette méthode dans le OnResume() de votre Activity.

Attention ! Il faut penser également à stopper la propagation du message lorsque votre Activity n'est plus au premier plan.
Code: Select All Code
protected void onPause()
{
super.onPause();
nfcAdapter.disableForegroundNdefPush(this);
}

protected void onResume()
{
super.onResume();
NdefRecord record = creerRecord("Exemple de message à envoyer");
NdefMessage message = creerMessage(record);
nfcAdapter.enableForegroundNdefPush(this, message);
}

Et voilà ! Maintenant vous êtes en mesure de faire dialoguer 2 téléphones équipés d'un capteur NFC juste en les rapprochant.

Peut être que vous ne voyez pas d'utilité particulière à cela en ce moment, mais par exemple vous pouvez vous en servir pour connecter 2 téléphones par Bluetooth sans impliquer l'utilisateur dans la procédure standard (et compliquée) habituelle. Ce sera justement le sujet du prochain tutoriel.

Re: [TUTO] Android et NFC : envoi d'un TAG

Message non luPosté: 05 Avr 2011, 17:09
par saman11
Très beau tuto bravo ! :wink

Re: [TUTO] Android et NFC : envoi d'un TAG

Message non luPosté: 19 Jan 2014, 19:37
par shithappens
Bonjour,

Merci pour ce tuto bien expliqué.

Tu parles à un moment d'un "id". Es-ce de l'uid du tag NFC que tu parles ?

Si non, Es-ce que tu connais une façon de choisir l'UID en envoyant un tag nfc ?

Je te remercie.