Vai al contenuto
Lingua: IT

Quali limiti del controller deve verificare il codice Android mentre gira?

Tutto ciò che il riferimento espone come metodo di lettura invece che come costante: la lunghezza massima di uno scambio, il sostegno per le APDU estese, il tempo di attesa, e quali classi facoltative compaiano. Due telefoni con la stessa versione di Android possono rispondere in modo diverso, quindi il codice legge questi valori sul tag in mano.

Quanto può portare un comando solo

getMaxTransceiveLength(), su NfcA, NfcV o IsoDep, rende il numero più grande di byte che una chiamata a transceive() può inviare. Dipende dal controller del telefono, e il riferimento non dà alcun valore da dare per scontato.

Le APDU aggiungono un secondo limite. Il riferimento di IsoDep spiega che un'APDU normale porta al massimo 255 byte di carico utile, 261 byte in tutto, mentre un'APDU di lunghezza estesa arriva a 65535, e che certi adattatori non sostengono la forma estesa. isExtendedLengthApduSupported() risponde per il telefono che hai in mano.

Una scheda che si aspetta APDU estese funziona quindi su un telefono e fallisce su un altro con lo stesso codice. Dove la scheda accetta anche la forma normale, ripiega su quella invece di dare per scontato il sostegno.

Quanto aspetta il telefono

setTimeout() su NfcA o IsoDep fissa quanto transceive() aspetta una risposta. Il riferimento di NfcA suggerisce un valore più lungo per le operazioni che prendono tempo al tag, come la generazione di una chiave, e nota che il valore torna a quello predefinito quando la connessione si chiude.

Il valore predefinito, a sua volta, non è documentato. Leggilo con getTimeout() invece di fissare nel codice la cifra misurata su un telefono, e rimetti il tuo valore dopo ogni connect().

Quali classi esistono

Le classi facoltative sono l'altra variabile. MifareClassic, MifareUltralight e NfcBarcode possono mancare del tutto da un telefono, e NdefFormatable compare solo per i tag che il telefono sa formattare.

L'unica prova affidabile è getTechList() sul tag che hai in mano, dato che l'assenza è silenziosa. La pagina delle classi di tecnologia copre quello che ciascuna classe ti dà.

Quello che spengono chi usa il telefono e il sistema

getDefaultAdapter() rende null quando il telefono non ha un controller NFC, e isEnabled() rende false quando chi usa il telefono ha spento l'NFC. Il riferimento di NfcAdapter suggerisce di mandarlo a Settings.ACTION_NFC_SETTINGS nel secondo caso.

Da Android 16, si possono anche rifiutare gli Intent di tag per una sola applicazione, cosa che isTagIntentAllowed() segnala. L'adattatore è acceso, l'applicazione è installata, e i tag non arrivano lo stesso, quindi vale la pena di verificarlo prima di qualsiasi ricerca del guasto.

Dal livello di API 34, getNfcAntennaInfo() rende quello che il telefono sa delle proprie antenne, posizione rispetto al dispositivo compresa, e può rendere null. Dove risponde, un'applicazione può mostrare dove tenere il tag invece di descriverlo a parole.

Domande frequenti

Quale lunghezza di scambio si può dare per scontata?

Nessuna. Leggi getMaxTransceiveLength sulla tecnologia connessa e spezza i comandi perché ci stiano.

Perché un'APDU funziona su un telefono e fallisce su un altro?

Può usare la forma di lunghezza estesa, che certi adattatori non sostengono. Verifica isExtendedLengthApduSupported e ripiega sulle APDU normali dove la scheda lo consente.

Un tempo di attesa fissato con setTimeout resta?

No. Il riferimento dice che torna a quello predefinito quando la connessione viene chiusa, quindi rimettilo dopo ogni connect.

Un'applicazione può sapere dov'è l'antenna NFC?

Dal livello di API 34, getNfcAntennaInfo rende le informazioni sulle antenne, posizione relativa compresa, quando il telefono le fornisce. Può rendere null, quindi serve un ripiego.