O que é uma mensagem NDEF, e como ela é construída?
Uma mensagem NDEF é uma sequência ordenada de registros. Cada registro carrega um cabeçalho curto que descreve que tipo de coisa é a carga útil dele, seguido da própria carga útil. Esse cabeçalho é a razão de ser de tudo: ele permite a um leitor que nunca viu a tag decidir o que fazer com o que encontra.
Uma mensagem é uma lista de registros
Uma tag guarda uma mensagem NDEF. Essa mensagem contém um ou mais registros, numa ordem definida, e sinalizadores marcam qual registro é o primeiro e qual é o último, para que um leitor saiba onde a mensagem começa e termina.
A maioria das tags por aí guarda exatamente um registro. Vários são possíveis e custam espaço e tempo de leitura, o que é uma troca que vale fazer de propósito em vez de por hábito.
O que um registro contém
O Android documenta a estrutura com precisão na referência NdefRecord dele, que é a descrição mais clara disponível livremente.
Um registro sempre carrega um campo de nome de tipo de três bits, em geral escrito TNF, que dá a tipagem de alto nível para o resto do registro. Depois dele vêm três campos de tamanho variável: um tipo, que dá a tipagem detalhada da carga útil, um identificador opcional que quase não se usa na prática, e a própria carga útil.
| Campo | Sempre presente | O que ele faz |
|---|---|---|
| TNF | Sim, três bits | Tipagem de alto nível, diz ao leitor como interpretar o campo de tipo |
| Tipo | Tamanho variável | Tipagem detalhada, como um esquema de URI ou um tipo MIME |
| Id | Opcional | Metadado de identificação, pouco usado |
| Carga útil | Tamanho variável | O conteúdo em si |
Por que o cabeçalho importa mais que a carga útil
Duas tags podem guardar bytes de carga útil idênticos e se comportar de modo completamente diferente, porque uma os declara como endereço da web e a outra os declara como texto simples.
A primeira abre um navegador. A segunda é exibida, ou ignorada por completo, dependendo da plataforma. Nada nos bytes mudou, e tudo no resultado mudou.
Essa é a coisa mais útil de entender sobre o NDEF, e explica a maioria dos casos de uma tag que é lida corretamente e não faz nada. O conteúdo estava bom. A declaração estava errada.
O que você vê numa ferramenta
Uma ferramenta de leitura em geral mostra a contagem de registros e, para cada registro, o tipo dele, o tamanho e o conteúdo. Se um registro mostra um tamanho e nenhum conteúdo reconhecível, a carga útil está lá e o tipo é algo que a ferramenta não decodifica.
Uma mensagem vazia é um estado válido e não uma falha. Uma tag formatada sem nada gravado guarda uma mensagem com um único registro vazio, e é por isso que uma tag nova é lida com sucesso e não faz nada.
Perguntas frequentes
Uma tag pode guardar mais de uma mensagem NDEF?
Uma mensagem por tag, contendo tantos registros quantos couberem. A mensagem é o contêiner e os registros são o conteúdo dela, então a questão de várias mensagens não se coloca na prática.
A ordem dos registros importa?
Sim, e mais do que as pessoas esperam, já que as plataformas em geral agem sobre o primeiro registro que reconhecem. Pôr uma reserva antes do registro que você de fato quer disparar é um erro comum e evitável.
Uma tag vazia é a mesma coisa que uma tag não formatada?
Não. Uma tag não formatada não tem estrutura que um leitor genérico possa usar. Uma tag formatada e vazia tem a estrutura e não tem conteúdo, e a diferença importa porque só a segunda está pronta para ser gravada normalmente.
Eu preciso entender isso para gravar uma tag?
Não para gravar uma URL com uma ferramenta, que cuida disso por você. Passa a ser necessário no instante em que algo se comporta de modo inesperado, porque quase toda surpresa remonta a um tipo de registro e não ao conteúdo.