Vai al contenuto
Lingua: IT

Come si dichiarano i tag che un'applicazione Android deve ricevere?

Con filtri di Intent nel manifest, risolti in un ordine fisso: prima il contenuto NDEF, poi gli elenchi di tecnologie. Filtra sul contenuto che la tua applicazione tratta, in minuscolo. Due cambiamenti recenti decidono se arriva qualcosa: i collegamenti web vanno ad ACTION_VIEW da Android 16, e Android 17 esige il permesso di smistamento NFC sull'attività.

Tre livelli, un vincitore

Due dichiarazioni vengono prima di ogni filtro: il permesso android.permission.NFC e, per un'applicazione che senza NFC non serve a niente, la funzionalità android.hardware.nfc segnata come necessaria, che Google Play usa per nascondere l'applicazione ai telefoni senza quell'hardware.

La guida alle basi dell'NFC elenca poi tre Intent di smistamento dalla priorità più alta alla più bassa: ACTION_NDEF_DISCOVERED per un tag il cui contenuto NDEF corrisponde a un tipo, ACTION_TECH_DISCOVERED quando nessuna attività tratta il primo, e ACTION_TAG_DISCOVERED come ultima risorsa.

Lo smistamento si ferma al primo livello dove un'attività corrisponde. Se ne corrispondono diverse a quel livello, a chi usa il telefono compare un selettore, che il riferimento di Tag presenta come il risultato che il progetto cerca di evitare, dato che muovere il telefono per scegliere di solito interrompe la connessione.

Il livello NDEF legge un record solo. Lo stesso riferimento dice che il sistema esamina il primo record del primo messaggio, quindi un messaggio che si apre con un record che la tua applicazione ignora è, per lo smistamento, un messaggio che parla d'altro.

Come viene smistato il primo record
Primo recordSmistato come
Tipo ben noto, URIUn URI costruito dal carico utile
Tipo ben noto, testoIl tipo MIME text/plain
Media MIMEIl tipo MIME che il record dichiara
URI assolutoUn URI costruito dal campo del tipo
Tipo esternoUn URI che comincia con vnd.android.nfc://ext/
Vuoto, sconosciuto o invariatoNiente: lo smistamento ripiega sulle tecnologie

Filtrare sul contenuto

Un filtro ACTION_NDEF_DISCOVERED nomina l'azione, la categoria DEFAULT e un elemento data: un tipo MIME, oppure uno schema con un host e un percorso.

Scrivi ogni parte in minuscolo. Il riferimento di IntentFilter dichiara che il confronto del tipo MIME, dello schema e dell'host distingue maiuscole e minuscole, a differenza degli RFC da cui vengono. Quando un record viene ricondotto a un URI, il riferimento di NdefRecord dice che lo schema viene messo in minuscolo e non dice nulla dell'host, quindi un tag scritto con un host in maiuscolo può mancare un filtro scritto in minuscolo.

Filtra su quello che la tua applicazione tratta e su niente di più ampio. L'esempio di smistamento in primo piano nella guida all'NFC avanzato registra ogni tipo MIME con un commento che chiede a chi sviluppa di nominare solo quelli che servono, e un filtro troppo largo mette l'applicazione nel selettore per tag che non sa usare.

Il cambiamento recente più grosso riguarda il tag più comune. Da Android 16, dichiara la guida alle basi dell'NFC, un tag che porta un collegamento http o https fa scattare ACTION_VIEW invece di ACTION_NDEF_DISCOVERED.

Da Android 17, lo stesso tag mostra prima una notifica di apertura del collegamento, e il collegamento si apre solo quando chi usa il telefono la tocca.

Un'applicazione che filtrava sul proprio indirizzo https tramite ACTION_NDEF_DISCOVERED smette quindi di ricevere quei tag su queste versioni. La documentazione rimanda ad Android App Links per aprire un'applicazione da un collegamento del genere.

Il cambiamento riguarda http e https e basta. La documentazione non descrive niente di simile per i record MIME, i tipi esterni o altri schemi, che continuano a passare per il livello NDEF.

Gli elenchi di tecnologie

ACTION_TECH_DISCOVERED ha bisogno di un filtro di Intent e di una voce meta-data che punti a una risorsa XML di elementi tech-list. Il riferimento di NfcAdapter dice la logica per esteso: ogni tecnologia dentro un tech-list deve essere presente, e un solo tech-list basta.

Nomina solo classi che ogni telefono di destinazione fornisce. Il riferimento di TagTechnology rende MifareClassic, MifareUltralight e NfcBarcode facoltative, e un telefono a cui ne manca una non la elenca mai, quindi un elenco di tecnologie che la esige non corrisponde mai su quel telefono, e niente lo segnala.

Quello che Android 16 e 17 esigono

Da Android 17, un'applicazione che punta a un SDK superiore ad Android 16 deve proteggere ogni attività che riceve Intent NFC con android.permission.DISPATCH_NFC_MESSAGE, affinché solo il servizio NFC di sistema possa avviarla. Lo stesso passaggio aggiunge che il sistema non smista Intent NFC a un'applicazione in stato arrestato: mai avviata da chi usa il telefono, o arrestata a forza.

Da Android 16, chi usa il telefono può rifiutare gli Intent di tag applicazione per applicazione. isTagIntentAppPreferenceSupported() dice se il telefono offre l'impostazione, isTagIntentAllowed() se la tua applicazione è rimasta ammessa, e ACTION_CHANGE_TAG_INTENT_PREFERENCE apre la pagina dove cambiarla.

E ACTION_TAG_DISCOVERED, il livello che prende tutto, è obsoleto da Android 17, il che lascia i filtri di contenuto e gli elenchi di tecnologie come le due vie di accesso sostenute.

Domande frequenti

Perché il mio filtro NDEF non scatta mai?

Controlla maiuscole e minuscole del tipo MIME, dello schema e dell'host, poi il primo record sul tag. Da Android 16, guarda se il tag porta un collegamento web, e su Android 17 se l'attività porta il permesso di smistamento.

Perché compare un selettore mentre la mia applicazione è installata?

Un'altra applicazione corrisponde allo stesso livello. Restringi il filtro a contenuto che solo la tua applicazione tratta, oppure nominala sul tag con un record applicativo Android.

Un record applicativo Android sostituisce i filtri di Intent?

No. Il sistema prova prima i filtri di Intent. Se l'attività che corrisponde non appartiene all'applicazione nominata, o se corrispondono più attività, avvia invece quella nominata, e apre Google Play quando non è installata.

La mia applicazione può ancora ricevere un tag che porta un collegamento web?

Tramite Android App Links, a cui la documentazione rimanda da Android 16. Un filtro NDEF sull'indirizzo https non riceve più il tag, e da Android 17 il collegamento aspetta che chi usa il telefono tocchi una notifica.