Welche Grenzen des Controllers muss Android-Code zur Laufzeit prüfen?
Alles, was die Referenz als Abfrage statt als Konstante anbietet: die größte Übertragungslänge, die Unterstützung erweiterter APDU, die Wartezeit, und welche optionalen Technologieklassen überhaupt erscheinen. Zwei Telefone mit derselben Android-Version können verschieden antworten, also liest Code diese Werte am Tag in der Hand.
Wie viel ein Befehl tragen kann
getMaxTransceiveLength(), auf NfcA, NfcV oder IsoDep, gibt die größte Zahl an Bytes zurück, die ein einzelner Aufruf von transceive() senden kann. Sie hängt vom Controller des Telefons ab, und die Referenz nennt keinen Wert, den man annehmen dürfte.
APDU bringen eine zweite Grenze mit. Die Referenz zu IsoDep erklärt, dass eine gewöhnliche APDU höchstens 255 Bytes Nutzlast trägt, 261 Bytes insgesamt, während eine APDU erweiterter Länge bis zu 65535 trägt, und dass manche Adapter die erweiterte Form nicht unterstützen. isExtendedLengthApduSupported() antwortet für das Telefon in der Hand.
Eine Karte, die erweiterte APDU erwartet, funktioniert daher auf einem Telefon und scheitert auf einem anderen mit demselben Code. Wo die Karte auch die gewöhnliche Form annimmt, weichen Sie darauf aus, statt Unterstützung vorauszusetzen.
Wie lange das Telefon wartet
setTimeout() auf NfcA oder IsoDep setzt, wie lange transceive() auf eine Antwort wartet. Die Referenz zu NfcA schlägt einen längeren Wert für Operationen vor, die den Tag Zeit kosten, etwa das Erzeugen eines Schlüssels, und hält fest, dass der Wert auf seine Voreinstellung zurückgeht, wenn die Verbindung geschlossen wird.
Die Voreinstellung selbst ist nicht dokumentiert. Lesen Sie sie mit getTimeout(), statt die auf einem Telefon gemessene Zahl fest einzutragen, und setzen Sie Ihren eigenen Wert nach jedem connect() erneut.
Welche Klassen es gibt
Die optionalen Klassen sind die andere Veränderliche. MifareClassic, MifareUltralight und NfcBarcode können einem Telefon ganz fehlen, und NdefFormatable erscheint nur bei Tags, die das Telefon formatieren kann.
Die einzig verlässliche Prüfung ist getTechList() am Tag in der Hand, da das Fehlen lautlos ist. Die Seite zu den Technologieklassen behandelt, was jede Klasse Ihnen gibt.
Was Nutzer und System abschalten
getDefaultAdapter() gibt null zurück, wenn das Telefon keinen NFC-Controller hat, und isEnabled() gibt false zurück, wenn NFC abgeschaltet wurde. Die Referenz zu NfcAdapter schlägt im zweiten Fall vor, zu Settings.ACTION_NFC_SETTINGS zu führen.
Ab Android 16 lassen sich Tag-Absichten auch für eine einzelne Anwendung ablehnen, was isTagIntentAllowed() meldet. Der Adapter ist an, die Anwendung ist installiert, und Tags kommen trotzdem nie an, also lohnt diese Prüfung vor jeder Fehlersuche.
Ab API-Ebene 34 gibt getNfcAntennaInfo() zurück, was das Telefon über seine Antennen weiß, einschließlich ihrer Lage am Gerät, und kann null zurückgeben. Wo es antwortet, kann eine Anwendung zeigen, wo der Tag zu halten ist, statt es in Worten zu beschreiben.
Häufige Fragen
Welche Übertragungslänge darf man annehmen?
Keine. Lesen Sie getMaxTransceiveLength auf der verbundenen Technologie und teilen Sie Befehle so, dass sie hineinpassen.
Warum funktioniert eine APDU auf einem Telefon und auf einem anderen nicht?
Sie kann die erweiterte Form benutzen, die manche Adapter nicht unterstützen. Prüfen Sie isExtendedLengthApduSupported und weichen Sie auf gewöhnliche APDU aus, wo die Karte es zulässt.
Bleibt eine mit setTimeout gesetzte Wartezeit bestehen?
Nein. Die Referenz sagt, dass sie auf die Voreinstellung zurückgeht, wenn die Verbindung geschlossen wird, also setzen Sie sie nach jedem connect erneut.
Kann eine Anwendung herausfinden, wo die NFC-Antenne sitzt?
Ab API-Ebene 34 gibt getNfcAntennaInfo Angaben zu den Antennen zurück, einschließlich der Lage, wenn das Telefon sie bereitstellt. Es kann null zurückgeben, also braucht die Anwendung einen Rückfallweg.