Vai al contenuto
Lingua: IT

Come fa un'applicazione Android a emulare una scheda con Host Card Emulation?

Con un servizio che estende HostApduService e risponde alle APDU, dichiarato nel manifest con il filtro di Intent dell'emulazione di scheda, il permesso BIND_NFC_SERVICE e un file XML che registra i suoi identificatori di applicazione in una categoria. Android avvia il servizio a un tocco, anche quando l'applicazione è chiusa.

Il servizio e i suoi due metodi

L'emulazione vive in un servizio, non in un'attività. La guida all'emulazione di scheda di Android costruisce il meccanismo su HostApduService, che gira in fondo: un tocco lo avvia se non è in esecuzione, e la transazione avviene senza che l'applicazione venga aperta. Verifica FEATURE_NFC_HOST_CARD_EMULATION prima di contarci, e dichiaralo con uses-feature nel manifest.

La classe ha due metodi da realizzare. processCommandApdu() viene chiamato per ciascuna APDU che il lettore invia, e rende i byte della risposta. Gira sul thread principale, quindi una risposta che richiede lavoro rende null e arriva dopo tramite sendResponseApdu() da un altro thread. onDeactivated() viene chiamato quando il lettore seleziona un identificatore che si risolve su un altro servizio, o quando il collegamento radio si rompe, e il suo argomento dice quale delle due cose è successa.

Quello che viaggia è un'APDU, come descrive la pagina delle APDU. Android emula ISO-DEP, ISO/IEC 14443-4, e tratta i comandi della ISO/IEC 7816-4; la guida impone ISO-DEP su NFC-A e lascia NFC-B facoltativo. Lo scambio è semiduplex e Android sostiene un canale logico solo, quindi comandi e risposte si alternano uno alla volta.

Quello che dichiarano il manifest e l'XML

La dichiarazione del servizio porta tre aggiunte: un filtro di Intent per l'azione del servizio APDU host, il permesso android.permission.BIND_NFC_SERVICE con android:exported a vero, e un tag di meta dati che punta a una risorsa XML. Il permesso è di sistema, quindi esigerlo vuol dire che solo il sistema operativo può legarsi al servizio. L'applicazione porta anche il permesso NFC.

Il file XML è dove vivono gli identificatori. La sua radice, host-apdu-service, porta una descrizione destinata a chi usa il telefono e, facoltativamente, requireDeviceUnlock. Contiene uno o più tag aid-group, ciascuno con una propria descrizione, una categoria, e uno o più tag aid-filter che portano un identificatore ciascuno, scritto in esadecimale con un numero pari di caratteri.

Un servizio che risponde da un elemento sicuro invece che dal tuo codice si dichiara allo stesso modo, con l'azione fuori host e una radice offhost-apdu-service. Android non ha alcuna API per parlare direttamente a un elemento sicuro, cosa che la pagina dell'elemento sicuro mette in prospettiva.

Gruppi di identificatori e categorie

Un identificatore di applicazione arriva a sedici byte, e il lettore lo nomina in un comando SELECT. La guida raccomanda di registrare il proprio secondo la ISO/IEC 7816-5 quando si installano lettori propri, così che non collida con nessuno. Gli identificatori che stanno insieme vanno in un gruppo, e Android instrada un gruppo per intero: o ogni identificatore che contiene raggiunge il tuo servizio, o nessuno.

Ciascun gruppo dichiara una categoria, pagamento o altro. Sul dispositivo può essere attivo un gruppo di pagamento solo alla volta, e un'applicazione che registra identificatori di pagamento fa transazioni soltanto quando porta il ruolo di portafoglio, da Android 15, o quando è in primo piano e ha chiamato setPreferredService. Un sistema chiuso, utilizzabile presso un solo esercente, sta nell'altra categoria, dove i gruppi possono restare attivi sempre. Quale servizio un lettore raggiunga davvero è l'argomento della pagina dell'instradamento.

Quello che lo scambio deve rispettare

Tienilo corto. La guida mette un limite superiore ragionevole attorno a 1 KB di dati, scambiabili in circa 300 ms, e quel bilancio decide quanto a lungo si deve tenere il telefono contro il lettore.

Tienilo dentro quello che la piattaforma emula. Host Card Emulation risponde allo scambio di comandi normalizzato; uno schema la cui sicurezza sta sotto quello strato, MIFARE Classic compreso, non si può emulare, come spiega la pagina di Host Card Emulation a chi non scrive il codice.

E decidi presto che cosa succede a schermo spento o a telefono bloccato, perché la risposta dipende dalla versione di Android e da un'impostazione del dispositivo più che dal tuo codice. La pagina dello schermo spento la prende versione per versione.

Domande frequenti

L'applicazione deve essere aperta perché l'emulazione funzioni?

No. Un tocco avvia il servizio se non è già in esecuzione, e lo scambio avviene in fondo senza alcuno schermo tuo.

Host Card Emulation può emulare una scheda MIFARE Classic?

No. Android emula ISO-DEP e tratta i comandi della ISO/IEC 7816-4, e gli schemi la cui sicurezza sta sotto quello strato restano fuori portata.

Perché processCommandApdu viene chiamato sul thread principale?

Perché il lettore aspetta una risposta. Rendi null quando la risposta richiede lavoro, poi inviala con sendResponseApdu da un altro thread.

Che cosa vuol dire onDeactivated?

O il lettore ha selezionato un identificatore che si risolve su un altro servizio, o il collegamento radio si è rotto. L'argomento dice quale delle due cose.