Coses que he après sobre l’NFC a Android

Bones!

Fa uns mesos vaig començar un d’aquells projectes que els comences, els talles, els segueixes, els oblides, hi tornes a treballar… d’aquells projectes que qual els reprens, coneixes al teu jo del passat. Aquell jo del que te n’arrepenteixes, que es nota que estava descobrint una nova tecnologia. Que te l’estimes, però li dires un parell de paraules ben dites. O tres… “fem un fifa?”.

Aquest flamant projecte mil vegades interrumput s’ha anomenat NFCar, i va començar com una prova per a conéixer el món de l’NFC sobre Android. L’idea era la de tenir un mecanisme on, a l’apropar el telèfon al cotxe, s’actives un escriptori especialment dissenyat per al cotxe, des d’on tenir un millor accès a les aplicacions que s’utilitzen mentre condueixes, i a més, afegint al layout el logotip del teu cotxe. És un d’aquells projectes que els fas per tu mateix, i que es publiquen al Market perquè si, sense moltes ganes de que es converteixi en una aplicació gaire utilitzada. Si us fa curiositat: http://kcy.me/90yj

Amb aquest post el que busco és compartir amb vosaltres tot el que he après d’NFC, i a més, recordar-li-ho a en Roc del futur, per si alguna vegada no se’n recorda d’algun d’aquests punts:

  • En Android 4.0 els tags NFC no es poden formatejar en NDEF, que és un standard molt chulo per a escriure en NFC. Això té algunes implicacions molt importants: Si no has comprat els tags pre-formatejats en NDEF, oblida’t d’escriure en format NDEF. I si en un tag formatat en NDEF hi escrius algun byte a ma, sense utilitzar l’standard, et carregaras el format NDEF i mai més el recuperaras. #etfelicitofill
  • Les aplicacions no poden ser proactives i preguntar si hi ha un NFC aprop. La connexió amb el tag es reb via Intent, i tu mateix has de guardar l’instància que se’t proporciona per a poder utilitzar-la en un futur. És a dir, si el mobil t’ha enviat una senyal de que tens un NFC aprop, i no te l’has guardat, ja ho has perdut. El tag NFC segueix aprop, i ho saps. Però no hi pots accedir. #etfelicitofill
  • Si vols mantenir una connexió amb un tag NFC (perquè saps que el tindras molt aprop durant molt de temps), no ho pots fer. És a dir, no pots posar un listener “onNfcDisconnected”. Si vols, pots crear-te tu mateix un mètode que vagi cridant a nfc.isConnected() periòdicament. És un mètode que funciona molt bé a casa, amb el mobil connectat via USB amb el teu ordenador… també quan fas proves amb el mobil desconnectat… Però quan la bateria baixa, molt i molt lluny del teu banc de proves, pot ser que la connexió amb l’NFC es perdi, tot i tenir el NFC enganxat al mobil. És a dir, si la bateria no està al 100%, el listener onNfcDisconnected que tu mateix t’has programat funcionarà una estona… 5 segons… 30 segons… potser un minut. Però arribarà un moment en que tornarà false, i no entendras per què. Doncs és perquè no tens la bateria al màxim. I això no està documentat enlloc. I ho estic provant amb el Galaxy Nexus, el nen bonic de Google. #etfelicitofill
  • El manual d’Android Developers t’explica com iniciar l’Activity a traves de l’Intent que es llença quan apropes el teu mobil a un tag NFC. Això està molt bé, i quan la teva aplicació creix, veus que la teva Activity principal està totalment acoplada amb el negoci que es fa sobre l’NFC. És a dir, que en la meva Activity principal, on m’agrada que tan sols es parli de Vista i interacció amb l’usuari, hi tinc un munt de codi acoplat que gestiona el control sobre l’NFC. Entesos, Google, la manera d’implementar la detecció d’un NFC és enviant-me un Intent que obre una de les meves Activities… però no m’animis a fer-me veure que això és bo. Ara que ja tinc el projecte acabat, veig que no hauria estat pas malament que tota la gestió de l’NFC fos en una Activity d’aquelles que no ensenyen res de res, i que depenguent del cas, em llences un Intent cap a la meva Activitat principal. Doncs bé, resumint: Google ens planteja una arquitectura… dubtosa. #etfelicitofill
  • Cada model de tag NFC s’escriu d’una manera. No em sembla malament poder escrirue els bytes en blocs de 64 bits per a millorar l’eficiència quan es pot, o poser-ho fer per linies quan aquell tag NFC en concret ho requereix… però no m’agrada estar obligat a empapar-me com s’escriure en cada un dels xips que van apareixent. Vull un “writeString” i un “readString”. I ja està. No demano tant. Si l’String és massa llarg per aquell tag NFC, que em llençi una TooLongMessageException. I ja està. #etfelicitofill
  • El mobil fa un soroll cada vegada que troba un NFC. El mobil desactiva l’scan d’NFC quan s’apaga la pantalla. El mobil torna a activar l’scan d’NFC quan s’encèn la pantalla. Aquests 3 elements que per separat no són pas dolents, junts són un atac a la paciència quan treballem amb la meva idea: mobil aprop de l’NFC durant tot el teu trajecte en cotxe. Quan s’apaga la pantalla, no passa res. Quan tornes a encendre la pantalla… s’emet de nou un soroll. Es considera que aquell NFC és nou, que te l’acaben de posar allà. I no forma part de la teva aplicació decidir si és nou o no. El mobil sona, si o si, i no pots apagar aquesta notificació sonora de cap manera. De fet, ni tan sols l’usuari pot. #etfelicitofill

 

A part d’això: molt bé. De fet, Android 4.0 s’ha inventat una cosa molt sexy: Escriure un NFC amb un standard propi d’Android, de manera que s’hi escriu el package de la teva aplicació. Aleshores, quan s’apropa el mobil a aquest NFC no es llença un Intent cap a cap aplicació, sino que o et llança l’aplicació definida pel package si la tens instal·lada, o et porta cap al Market per a que te la descarreguis. Molt bé! Amb aquesta funcionalitat s’obre un món de possibilitats. Apropa el teu mobil a aquesta estació de Bicing i baixa’t l’aplicació oficial. O no.

Quan tingui un moment, pujaré el codi de l’app a Google Code per a que podeu veure el que he escrit. Espero que us sigui molt últil, i sobretot, que no patiu els fracassos que jo he patit. Stay tuned to this post! :·)