Come si scrive un messaggio NDEF da un'applicazione Android?
Apri Ndef su un tag formattato, o NdefFormatable su uno vergine, connettiti fuori dal thread principale, verifica che il tag sia scrivibile e che il messaggio ci stia, poi scrivi tutto il messaggio in una sola chiamata. Mettere il tag in sola lettura è una chiamata a parte, e il riferimento dice chiaramente che non si può tornare indietro.
Costruire il messaggio
La classe NdefRecord costruisce per te i record più comuni: createUri dal livello di API 14, createMime dal livello di API 16 e createTextRecord dal livello di API 21. Assemblare i byte a mano è il punto da cui partono gli errori di codifica, e questi aiuti tolgono la necessità di farlo.
createMime mette il tipo MIME in minuscolo per seguire le regole di Android sul filtraggio degli Intent, quindi il tipo scritto sul tag corrisponde già a un filtro in minuscolo.
Metti per primo il record che conta. Android smista sul primo record, e un messaggio che si apre con un record di testo viene smistato come text/plain, qualunque cosa segua. Che cosa contengono i record è coperto dalla pagina sulla struttura del messaggio.
Che cosa verificare prima di scrivere
Tre valori arrivano senza toccare la radio. isWritable() dice se il tag è in sola lettura, e getMaxSize() dà il messaggio NDEF più grande che accetta, in byte. Il messaggio conosce la propria dimensione: il riferimento di NdefMessage documenta getByteArrayLength() come la lunghezza che occuperà una volta serializzato.
Confronta gli ultimi due prima di chiamare qualsiasi cosa che scriva. Un messaggio più lungo di un byte fallisce alla scrittura, dopo che chi usa il telefono lo ha tenuto fermo per niente, e il confronto non costa nulla.
getCachedNdefMessage() può rendere null su un tag formattato che non porta ancora alcun messaggio, quello che il riferimento chiama lo stato inizializzato. È un tag pronto a scrivere, non un tag che non si è lasciato leggere.
La scrittura vera e propria
connect(), poi writeNdefMessage(), poi close(), su un thread che non sia quello principale. Il riferimento di Ndef segna la scrittura come bloccante e come una sovrascrittura di qualunque messaggio il tag portasse.
Un tag vergine passa invece per NdefFormatable.format(), che lo formatta e scrive un primo messaggio in una chiamata sola. Il riferimento descrive un processo in più passi che solleva IOException se un passo qualsiasi fallisce, quindi un'eccezione dice che il processo si è fermato, non dove.
Quattro eccezioni chiedono quattro risposte. FormatException vuol dire che è il messaggio a essere malformato. TagLostException vuol dire che il tag ha lasciato il campo. IOException copre gli altri guasti e un annullamento. SecurityException vuol dire che l'oggetto Tag è scaduto, usato dopo che il suo tag ha lasciato il campo.
Dopo una TagLostException, non dare niente per scontato. Rileggi il tag prima di riprovare, dato che la scrittura può essere finita, fallita o essersi fermata a metà, il caso che la pagina della scrittura interrotta copre dal lato di chi usa il telefono.
La sola lettura va in un senso solo
makeReadOnly() mette il contenitore di capacità in sola lettura e, dove il tag lo consente, fissa i bit di blocco in modo permanente. Il riferimento lo chiama un processo a senso unico su cui non si torna indietro.
Verifica prima canMakeReadOnly(), e non legare mai la chiamata allo stesso pulsante della scrittura. NdefFormatable.formatReadOnly() fa le due cose in una chiamata sola, il che toglie l'ultima occasione di verificare il contenuto prima che venga congelato.
Blocca alla fine di una serie verificata, ammesso che lo si faccia. Quando bloccare è la decisione giusta è coperto dalla pagina del blocco.
Rileggere il risultato
Verifica con getNdefMessage(), che legge il tag, e mai con il messaggio conservato, che descrive ancora il tag com'era prima della scrittura.
Poi leggi il tag con qualcosa che non sia il tuo codice, e sull'altra piattaforma. Un difetto che scrive il tipo di record sbagliato lo decodifica nello stesso modo sbagliato, e un iPhone può ignorare un record che il tuo codice Android accetta.
Domande frequenti
Una scrittura piccola può girare sul thread principale?
No. Il riferimento segna ogni scrittura come un'operazione bloccante che non deve girare sul thread principale, qualunque sia la sua dimensione.
Perché writeNdefMessage solleva FormatException?
Il riferimento la solleva quando il messaggio NDEF da scrivere è malformato, quindi la correzione sta nel messaggio, non nel tag.
NdefFormatable funziona su ogni tag vergine?
No. Compare solo sui tag che il telefono sa formattare, e il riferimento dice che nessun insieme di tag è obbligatorio su tutti i dispositivi.
Un tag in sola lettura può tornare scrivibile?
No. Il riferimento descrive makeReadOnly come un processo a senso unico su cui non si torna indietro.