Welche Technologieklasse sollte Android-Code für einen Tag öffnen?
Die höchste Ebene, die die Aufgabe erfüllt. Ndef liest und schreibt Inhalt auf jedem Typ des NFC Forum, NdefFormatable bereitet einen leeren Tag vor, IsoDep trägt APDU, und NfcA oder NfcV senden rohe Befehle, wenn Inhalt nicht genügt. Prüfen Sie zuerst getTechList: drei Klassen sind optional.
Was getTechList meldet
Jeder erkannte Tag kommt mit einem Tag-Objekt, und dessen getTechList() benennt die Klassen, die Ihr Code darauf öffnen darf. Ein Tag meldet meist mehrere auf einmal: die Referenz zu MifareUltralight hält fest, dass NfcA in jedem Fall daneben aufgeführt wird, da jeder solche Tag auch ein NFC-A-Tag ist.
| Klasse | Was sie Ihrem Code gibt | Auf jedem Telefon vorgeschrieben |
|---|---|---|
Ndef | NDEF lesen und schreiben auf den NFC-Forum-Typen 1 bis 4 | Ja |
NdefFormatable | Einen leeren Tag formatieren und eine erste Nachricht schreiben | Nur für Tags, die das Telefon formatieren kann |
NfcA, NfcB, NfcF, NfcV | Rohe Befehle auf der Funkebene der jeweiligen Technologie | Ja |
IsoDep | APDU über ISO/IEC 14443-4 | Ja |
MifareClassic | Zugriff auf Sektoren nach Authentifizierung mit einem Schlüssel | Nein |
MifareUltralight | Seiten lesen und schreiben | Nein |
NfcBarcode | Tags, die nur einen Strichcode tragen | Nein |
Die Liste steht beim Erkennen fest. Die Referenz zu TagTechnology teilt jede Klasse in gemerkte Abfragen, die den Tag beschreiben, wie er beim Eintritt ins Feld war, und nie aktualisiert werden, und in Ein- und Ausgabeoperationen, die mit dem Tag sprechen und blockieren können.
Die höchste Ebene, die genügt
Ndef verbirgt die Unterschiede zwischen den Tag-Typen: dieselben Aufrufe lesen und schreiben einen Aufkleber vom Typ 2 und eine Karte vom Typ 4. Code, der dagegen geschrieben ist, funktioniert weiter, wenn der Lieferant den Chip wechselt.
Die rohen Klassen nehmen diesen Schutz weg. NfcA.transceive() sendet Ihre Bytes unverändert, der Controller fügt nur die Prüfsumme hinzu, sodass Befehlssatz und Speicheraufteilung Ihr Problem werden, und beide unterscheiden sich von Chip zu Chip. Sie stehen im Datenblatt des jeweiligen Chips, das diese Seite wakdev.com überlässt.
IsoDep liegt dazwischen. Es trägt APDU zu Karten und zu Tags vom Typ 4, und die Referenz zu IsoDep sagt, dass es lange Austausche selbst zerlegt und wieder zusammensetzt, sodass Ihr Code ganze Befehle sendet.
NdefFormatable ist für einen einzigen Moment im Leben eines Tags da. Seine Referenz räumt ein, dass die Verfahren zum Formatieren eines Tags nicht vom NFC Forum festgelegt und nicht allgemein bekannt sind, weshalb die Klasse nur bei Tags erscheint, die ein bestimmtes Telefon zu formatieren weiß.
Eine Verbindung auf einmal
Ein Tag nimmt eine geöffnete Klasse auf einmal an. Die Referenz sagt das unmissverständlich, und ein zweites connect() scheitert mit IOException, sodass Code, der Ndef zum Lesen und danach NfcA zum Abfragen des Chips öffnet, das erste schließen muss, bevor er das zweite öffnet.
Jeder Aufruf, der die Funkschnittstelle berührt, blockiert und muss vom Hauptthread fernbleiben. close() ist der Ausweg aus einem blockierten Aufruf: aus einem anderen Thread abgesetzt, bricht es die laufende Operation mit IOException ab.
Ein Tag-Objekt hängt außerdem an einem einzigen Auftreten. Die Referenz zu Tag sagt, dass bei jedem Eintritt in die Reichweite ein neues Objekt entsteht, auch für denselben physischen Tag, und dass nur das jüngste eine Klasse öffnen kann. Ein älteres nach dem Verschwinden seines Tags zu benutzen, löst SecurityException aus.
Klassen, die ein Telefon nicht anbietet
Drei Klassen sind optional, und ihr Fehlen ist lautlos. Ein Telefon, das MifareClassic nicht umsetzt, führt es nie auf, sodass dieselbe Karte die Klasse auf einem Telefon meldet und auf einem anderen nicht, und Code, der sie voraussetzte, scheitert erst im Einsatz.
Ndef selbst ist nur auf den NFC-Forum-Typen 1 bis 4 zugesichert. Die Referenz zu Ndef behandelt herstellereigene Formate, NDEF auf MIFARE Classic eingeschlossen, als bestes Bemühen und empfiehlt aus diesem Grund die NFC-Forum-Typen für neue Einsätze.
Prüfen Sie also auf die Klasse, nicht auf das Telefonmodell. Die Liste, die der Tag in der Hand meldet, ist die einzige Antwort, die auch auf dem nächsten Telefon noch gilt.
Häufige Fragen
Kann ich Ndef und NfcA gleichzeitig auf demselben Tag öffnen?
Nein. Nur eine Klasse kann auf einmal mit einem Tag verbunden sein, also schließen Sie die erste, bevor Sie die zweite verbinden.
Warum fehlt NdefFormatable auf einem leeren Tag?
Das Telefon weiß nicht, wie es diesen Tag formatiert. Die Referenz sagt, dass die Klasse nur für Tags aufgeführt wird, die das Gerät formatieren kann, und dass kein Satz von Tags vorgeschrieben ist.
Warum zeigt getCachedNdefMessage nach dem Schreiben noch den alten Inhalt?
Sie gibt die Nachricht zurück, die beim Eintritt ins Feld gelesen wurde, und aktualisiert sie nie. Lesen Sie den aktuellen Inhalt mit getNdefMessage, die mit dem Tag spricht.
Sollte neuer Code MifareClassic benutzen?
Nur um vorhandene MIFARE-Classic-Karten zu lesen, und mit einem Rückfallweg für Telefone, denen die Klasse fehlt. Sie ist optional, und die Referenz zu Ndef empfiehlt für neue Einsätze die NFC-Forum-Typen.