Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Leer Un Tag NFC
Leer Un Tag NFC
La lectura de un tag NFC se realiza una vez se ha decidido qué actividad se hace cargo del mismo. El
tag y su contenido se proveen a la actividad en la intención, que contiene también la acción que
permite determinar qué tipo de mensaje contiene el tag; basta con comprobar el valor de la acción de
la intención para saber qué método utilizar para descifrar el o los mensajes.
if(intent.getAction().equals(NfcAdapter.ACTION_NDEF_DISCOVERED))
Log.d(TAG,"Lectura de un tag NDEF");
else
if(intent.getAction().equals(NfcAdapter.ACTION_TECH_DISCOVERED))
Log.d(TAG,"Lectura de un tag TECH");
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];
Cada Nde fMessageque se extrae contiene uno o varios NdefRecord, que son las entidades que
contienen los mensajes propiamente dichos.
En cada objeto Nd efRecord, el mensaje se almacena como una tabla de bytes, llamada Payload, a
la que se accede mediante el método ge tPayload()del objeto NdefRecord. Es preciso convertir
estos datos en función del formato del registro NdefRecord. Para ello, el
objeto NdefRecordexpone los métodos: getTnf(), que devuelve el formato del NdefRecord,
yg etType(), que devuelve el subtipo en el caso de que el tipo
de Nde fRecordsea TNF_WELL_KNOWN.
La API 16 de Android presenta varios métodos para la clase NdefRecord, que facilitan la lectura e
interpretación de los registros. Veremos cómo leer el contenido de registros NdefRecord mediante
estos métodos, y cómo reemplazar estos métodos cuando la aplicación está preparada para una API
anterior.
El primer byte (pay load[0]) contiene un indicador que define el protocolo de la URI. Este
formato se utiliza para aumentar la memoria disponible para el detalle de la URI, ahorrando
así el espacio necesario para escribir el protocolo.
El protocolo puede decodificarse según las correspondencias dadas en la tabla siguiente (extracto):
0 0x00 N/A. No prepending is done, and the URI field contains the
unabridged URI.
1 0x01 http://www.
2 0x02 https://www.
3 0x03 http://
4 0x04 https://
5 0x05 tel:
6 0x06 mailto:
7 0x07 ftp://anonymous:anonymous@
8 0x08 ftp://ftp.
9 0x09 ftps://
… … …
if(payload.length<2)
return null;
Un primer elemento define la codificación, UTF-8 o UTF-16, así como la longitud del código que
le sigue.
La extracción del texto del registro consiste, por tanto, en determinar la codificación de la cadena de
caracteres "útiles" de payload y, a continuación, transcribir la tabla de bytes como una cadena de
caracteres en función de su codificación.
String formatoCodificacion =
((payload[0] & 0200) == 0) ? "UTF-8" : "UTF-16";
String codigoLenguaje =
new String(payload, 1, longitudCodigoLenguaje, "US-ASCII");
Un tag de tipo TNF_MIME_MEDIA incluye dos campos: el tipo MIME, que debe leerse mediante el
método ge tType()del objeto NdefRecord, y un contenido (value), al que se accede mediante el
método ge tValue().
RTD_URI URI.
Basta, entonces, con determinar el subtipo del tag TNF_WELL_KNOWN, y procesar el payload del tag
en función del subtipo.
if(record.getType()==NdefRecord.RTD_TEXT) {
//... tratar el payload como para leer una cadena de
caracteres
}
else if (record.getType()==NdefRecord.RTD_URI) {
//... tratar el payload como para leer una URI
}