Forums GAMERGEN

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

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

Message non lupar Viish » 14 Mar 2011, 08:54

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.
Mes tutos Android (en Français) : http://www.thinkdroid.eu
Viish Gamer du Dimanche
Gamer du Dimanche
Messages: 21
Inscription: 03 Aoû 2010, 00:05
Localisation: Grenoble
Prénom: Sylvain
Pays: France
Sexe: Homme

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

Message non lupar saman11 » 05 Avr 2011, 17:09

Très beau tuto bravo ! :wink
saman11 Gamer Maitre
Gamer Maitre
Messages: 282
Inscription: 29 Juil 2010, 12:34
Prénom: Saman
Pays: France
Sexe: Homme

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

Message non lupar shithappens » 19 Jan 2014, 19:37

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.
shithappens Gamer Débutant
Messages: 1
Inscription: 19 Jan 2014, 19:32
Prénom: Gaspar
Pays: France


 

Retourner vers Vos tutos et astuces Android