Saltar al contenido
Idioma: ES

¿Cómo se escribe un mensaje NDEF desde una app Android?

Abre Ndef en una etiqueta formateada, o NdefFormatable en una virgen, conecta fuera del hilo principal, comprueba que la etiqueta admite escritura y que el mensaje cabe, y escribe el mensaje entero en una sola llamada. Dejar la etiqueta en solo lectura es otra llamada, y la referencia dice sin rodeos que no tiene vuelta atrás.

Construir el mensaje

La clase NdefRecord construye por ti los registros más corrientes: createUri desde el nivel de API 14, createMime desde el 16 y createTextRecord desde el 21. Montar los bytes a mano es donde empiezan los errores de codificación, y los ayudantes quitan la necesidad.

createMime pasa el tipo MIME a minúsculas para seguir las reglas de Android sobre el filtrado de intents, así que el tipo escrito en la etiqueta ya coincide con un filtro en minúsculas.

Pon delante el registro que importa. Android despacha según el primero, y un mensaje que empieza por un registro de texto se despacha como text/plain, venga lo que venga detrás. Lo que contienen los registros lo cubre la página de la estructura del mensaje.

Qué comprobar antes de escribir

Tres valores llegan sin tocar la radio. isWritable() dice si la etiqueta es de solo lectura, y getMaxSize() da el mensaje NDEF más grande que acepta, en bytes. El mensaje conoce su propio tamaño: la referencia de NdefMessage documenta getByteArrayLength() como la longitud que ocupará una vez serializado.

Compara los dos últimos antes de llamar a nada que escriba. Un mensaje que sobra por un byte falla en la escritura, después de que alguien haya sostenido el teléfono quieto para nada, y la comparación no cuesta nada.

getCachedNdefMessage() puede devolver null en una etiqueta formateada que todavía no contiene ningún mensaje, lo que la referencia llama el estado inicializado. Eso es una etiqueta lista para escribir, no una etiqueta que no se ha podido leer.

La escritura en sí

connect(), después writeNdefMessage(), después close(), en un hilo que no sea el principal. La referencia de Ndef marca la escritura como una operación que detiene el hilo y que sobrescribe el mensaje que la etiqueta contuviera.

Una etiqueta virgen pasa por NdefFormatable.format(), que la formatea y escribe un primer mensaje en una sola llamada. La referencia describe un proceso de varios pasos que lanza IOException si falla cualquiera de ellos, así que una excepción dice que el proceso se detuvo, no dónde.

Cuatro excepciones piden cuatro respuestas. FormatException quiere decir que el mensaje en sí está mal formado. TagLostException, que la etiqueta salió del campo. IOException cubre los demás fallos y una cancelación. SecurityException quiere decir que el objeto Tag está caducado, usado después de que su etiqueta saliera del campo.

Después de una TagLostException, no des nada por supuesto. Vuelve a leer la etiqueta antes de reintentar, ya que la escritura puede haber terminado, haber fallado o haberse parado a la mitad, el caso que la página del fallo a mitad de camino cubre desde el lado de quien la usa.

Solo lectura va en un sentido

makeReadOnly() deja el contenedor de capacidades en solo lectura y, donde la etiqueta lo permite, fija los bits de bloqueo de forma permanente. La referencia lo llama un proceso de un solo sentido que no tiene vuelta atrás.

Comprueba antes canMakeReadOnly(), y no ates nunca esa llamada al mismo botón que la escritura. NdefFormatable.formatReadOnly() hace las dos cosas en una sola llamada, lo que quita la última ocasión de verificar el contenido antes de congelarlo.

Bloquea al final de una tanda verificada, si es que bloqueas. Cuándo bloquear es la decisión correcta lo cubre la página del bloqueo.

Volver a leerlo

Verifica con getNdefMessage(), que lee la etiqueta, y nunca con el mensaje guardado, que sigue describiendo la etiqueta tal como estaba antes de escribir.

Después lee la etiqueta con algo que no sea tu código, y en la otra plataforma. Un fallo que escribe el tipo de registro equivocado lo descodifica igual de mal, y un iPhone puede no hacer caso de un registro que tu analizador de Android acepta.

Preguntas frecuentes

¿Puede una escritura pequeña correr en el hilo principal?

No. La referencia marca cada escritura como una operación que detiene el hilo y que no debe correr en el principal, sea cual sea su tamaño.

¿Por qué writeNdefMessage lanza FormatException?

La referencia la levanta cuando el mensaje NDEF que hay que escribir está mal formado, así que el arreglo está en el mensaje y no en la etiqueta.

¿NdefFormatable funciona en cualquier etiqueta virgen?

No. Aparece solo en las etiquetas que el teléfono sabe formatear, y la referencia dice que ningún conjunto de etiquetas es obligatorio en todos los dispositivos.

¿Se puede volver a hacer escribible una etiqueta de solo lectura?

No. La referencia describe makeReadOnly como un proceso de un solo sentido que no tiene vuelta atrás.