Saltar al contenido
Idioma: ES

¿Qué clase de tecnología debe abrir el código Android para una etiqueta?

La de nivel más alto que haga el trabajo. Ndef lee y escribe contenido en cualquier tipo del NFC Forum, NdefFormatable prepara una etiqueta virgen, IsoDep lleva APDU, y NfcA o NfcV envían comandos en bruto cuando el contenido no basta. Mira primero getTechList: tres clases son opcionales y en algunos teléfonos no aparecen nunca.

Lo que declara getTechList

Cada etiqueta descubierta llega con un objeto Tag, y su getTechList() nombra las clases que tu código puede abrir sobre ella. Una etiqueta suele declarar varias a la vez: la referencia de MifareUltralight señala que NfcA se enumera junto a ella en todos los casos, ya que cada etiqueta de ese tipo es además una etiqueta NFC-A.

Las clases de tecnología, y si un teléfono tiene que ofrecerlas
ClaseLo que le da a tu códigoObligatoria en todo teléfono
NdefLectura y escritura NDEF en los tipos 1 a 4 del NFC ForumSí
NdefFormatableFormatear una etiqueta virgen y escribir un primer mensajeSolo para las etiquetas que el teléfono sabe formatear
NfcA, NfcB, NfcF, NfcVComandos en bruto al nivel de radio de cada tecnologíaSí
IsoDepAPDU sobre ISO/IEC 14443-4Sí
MifareClassicAcceso por sector tras autenticación con claveNo
MifareUltralightLectura y escritura por páginaNo
NfcBarcodeEtiquetas que solo contienen un código de barrasNo

La lista queda fijada en el descubrimiento. La referencia de TagTechnology separa cada clase en descriptores guardados, que describen la etiqueta tal como estaba al entrar en el campo y no se actualizan nunca, y operaciones de entrada y salida, que hablan con la etiqueta y pueden detener el hilo.

El nivel más alto que haga el trabajo

Ndef esconde las diferencias entre tipos de etiqueta: las mismas llamadas leen y escriben una pegatina de tipo 2 y una tarjeta de tipo 4. El código escrito contra ella sigue funcionando cuando el proveedor cambia de chip.

Las clases en bruto quitan esa protección. NfcA.transceive() envía tus bytes tal cual, y el controlador solo añade el CRC, así que el juego de comandos y el mapa de memoria pasan a ser problema tuyo, y los dos cambian de un chip a otro. Están definidos en la hoja de datos de cada chip, que este sitio deja a wakdev.com.

IsoDep queda entre las dos. Lleva APDU a tarjetas y a etiquetas de tipo 4, y la referencia de IsoDep dice que ella misma fragmenta y recompone los intercambios largos, así que tu código envía comandos enteros.

NdefFormatable sirve para un solo momento de la vida de una etiqueta. Su referencia admite que los procedimientos para formatear una etiqueta no los especifica el NFC Forum y no son de conocimiento general, y por eso la clase aparece solo en las etiquetas que un teléfono dado sabe formatear.

Una conexión cada vez

Una etiqueta acepta una clase abierta cada vez. La referencia lo dice sin rodeos, y un segundo connect() falla con IOException, así que un código que abre Ndef para leer y después NfcA para preguntar al chip tiene que cerrar la primera antes de abrir la segunda.

Cada llamada que toca la radio detiene el hilo y tiene que quedarse fuera del principal. close() es la salida de una llamada detenida: hecha desde otro hilo, cancela la operación pendiente con IOException.

Un objeto Tag está atado además a una sola aparición. La referencia de Tag dice que se crea un objeto nuevo cada vez que la etiqueta entra en alcance, incluso para la misma etiqueta física, y que solo el más reciente puede abrir una clase. Usar uno antiguo después de que su etiqueta se haya ido levanta SecurityException.

Clases que un teléfono puede no ofrecer

Tres clases son opcionales, y su ausencia es silenciosa. Un teléfono que no implementa MifareClassic no la enumera nunca, así que la misma tarjeta declara la clase en un teléfono y no en otro, y un código que dio por supuesta la clase falla solo sobre el terreno.

Ndef misma está garantizada solo en los tipos 1 a 4 del NFC Forum. La referencia de Ndef trata los formatos de fabricante, NDEF guardado sobre MIFARE Classic incluido, como un intento sin garantía, y por esa razón recomienda los tipos del NFC Forum para los despliegues nuevos.

Así que comprueba la clase, no el modelo de teléfono. La lista que declara la etiqueta que tienes en la mano es la única respuesta que sigue valiendo en el teléfono siguiente.

Preguntas frecuentes

¿Puedo abrir Ndef y NfcA sobre la misma etiqueta a la vez?

No. Solo una clase puede estar conectada a una etiqueta cada vez, así que cierra la primera antes de conectar la segunda.

¿Por qué falta NdefFormatable en una etiqueta virgen?

El teléfono no sabe formatear esa etiqueta. La referencia dice que la clase se enumera solo para las etiquetas que el dispositivo sabe formatear, y que ningún conjunto de etiquetas es obligatorio.

¿Por qué getCachedNdefMessage sigue mostrando el contenido antiguo tras escribir?

Devuelve el mensaje leído cuando la etiqueta entró en el campo y no se actualiza nunca. Lee el contenido actual con getNdefMessage, que habla con la etiqueta.

¿Debería un código nuevo usar MifareClassic?

Solo para leer tarjetas MIFARE Classic que ya existen, y con un plan alterno para los teléfonos que no la tienen. La clase es opcional, y la referencia de Ndef recomienda los tipos del NFC Forum para los despliegues nuevos.