Lectura de NFC en Android

Para introduzirte a NFC, comienza leyendo el post anterior

Cada tag o etiqueta NFC puede guardar contenido diverso en su interior segun el formato NDEF, lo mas habitual es guardar cadenas de texto, contenido mime/media para ser lanzado por una aplicacion o contenido de URIs, entre otros.

En el momento de pasar el terminal por encima de un tag, lanzaremos una u otra actividad según el formato que sea detectado (TNF TYPE). Esto es genial, puesto que podemos hacer un tag personalizado de manera que al leerlo salte la aplicacion que hemos generado para su lectura.

A nivel tecnico, al leer un Tag con formato NDEF, se recupera el primer Record de ese mensaje y se construye un Inet dependiendo del tipo de ndef que se ha leído.

tipos de nfcEn la imagen podemos ver en el lado izquierdo el contenido de diversos mensajes NDEF y en el lado derecho como debemos configurar los Intent-Filter del manifest para que lancen nuestra aplicacion al detectar contenido de un tipo especifico.

La base de codigo para leer una etiqueta NFC que contiene texto plano seria esto:

1) AndroidManifest.xml:

<manifest xmlns:android=”http://schemas.android.com/apk/res/android”    package=”……”    android:versionCode=”1″    android:versionName=”1.0″ >
<uses-permission android:name=”android.permission.NFC”>
</uses-permission>    <application        android:icon=”……”        android:label=”……” >               <activity            android:label=”……”            android:name=”……” >
<intent-filter >
<action android:name=”android.nfc.action.NDEF_DISCOVERED” />
<data android:mimeType=”text/plain” />
</intent-filter>
</activity>
……
</application>

</manifest>

2) Lectura del contenido desde la actividad

protected void onResume(){
....
 NdefMessage msg = getIntent().getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)[0];
....
}

Esto es en su estado mas basico pero os dejo un par de metodos que me he creado y creo que son muy utiles para hacer una lectura y un procesado mas a fondo:

PendingIntent mNfcPendingIntent;
IntentFilter[] mWriteTagFilters;
IntentFilter[] mNdefExchangeFilters;

@Override
protected void onResume() {
		super.onResume();
		mNfcAdapter.enableForegroundDispatch(this, mNfcPendingIntent,mWriteTagFilters, null);
}

// Al detectar un nuevo tagNFC, se crea un nuevo intent y debemos averiguar
// que hacer con él
protected void onNewIntent(Intent intent) {
		try{
		// Modo Lectura
		if (!mWriteMode	&& NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
			NdefMessage[] msgs = recuperarMensajesNdef(intent);
			toast("mensaje NDEF: " + new String(msgs[0].getRecords()[0].getPayload()));
			System.out.println("--mensaje NDEF: " + new String(msgs[0].getRecords()[0].getPayload()));
		}
                }catch(Exception e){toast("Error al leer el Tag: ");}
}

public NdefMessage[] recuperarMensajesNdef(Intent intent) {
		// Parse the intent
		NdefMessage[] msgs = null;
		String action = intent.getAction();
		if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)
				|| NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
			Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
			if (rawMsgs != null) {
				msgs = new NdefMessage[rawMsgs.length];
				for (int i = 0; i < rawMsgs.length; i++) {
					msgs[i] = (NdefMessage) rawMsgs[i];
				}
			} else {
				// Unknown tag type
				byte[] empty = new byte[] {};
				NdefRecord record = new NdefRecord(NdefRecord.TNF_UNKNOWN,
						empty, empty, empty);
				NdefMessage msg = new NdefMessage(new NdefRecord[] { record });
				msgs = new NdefMessage[] { msg };
			}
		} else {
			// Log.d(TAG, "Unknown intent.");
			finish();
		}
		return msgs;
}

En un Tag NFC no es recomendable almacenar mas de 1Kb. Seria una locura intentar almacenar un XML, ya que el tag no esta concebido para ello.

This entry was posted in Android, NFC. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *