Zum Inhalt springen
Sprache: DE

Wie schreibt man eine NDEF-Nachricht aus einer Android-Anwendung?

Öffnen Sie Ndef auf einem formatierten Tag oder NdefFormatable auf einem leeren, verbinden Sie abseits des Hauptthreads, prüfen Sie, ob der Tag beschreibbar ist und die Nachricht hineinpasst, und schreiben Sie dann die ganze Nachricht in einem Aufruf. Den Tag schreibgeschützt zu machen ist ein eigener Aufruf, der sich nicht rückgängig machen lässt.

Die Nachricht bauen

Die Klasse NdefRecord baut die gängigen Datensätze für Sie: createUri ab API-Ebene 14, createMime ab API-Ebene 16 und createTextRecord ab API-Ebene 21. Die Bytes von Hand zusammenzusetzen ist die Stelle, an der Kodierfehler beginnen, und die Helfer nehmen die Notwendigkeit dazu weg.

createMime schreibt den MIME-Typ klein, um Androids Regeln für das Filtern von Absichten zu folgen, sodass der auf den Tag geschriebene Typ bereits zu einem klein geschriebenen Filter passt.

Setzen Sie den Datensatz, auf den es ankommt, nach vorn. Android stellt nach dem ersten Datensatz zu, und eine Nachricht, die mit einem Textdatensatz beginnt, wird als text/plain zugestellt, was auch immer folgt. Was die Datensätze enthalten, behandelt die Seite zum Aufbau einer Nachricht.

Was vor dem Schreiben zu prüfen ist

Drei Werte kommen, ohne die Funkschnittstelle zu berühren. isWritable() sagt, ob der Tag schreibgeschützt ist, und getMaxSize() gibt die größte NDEF-Nachricht an, die er annimmt, in Bytes. Die Nachricht kennt ihre eigene Größe: die Referenz zu NdefMessage beschreibt getByteArrayLength() als die Länge, die sie nach dem Serialisieren einnimmt.

Vergleichen Sie die beiden letzten, bevor Sie irgendetwas aufrufen, das schreibt. Eine Nachricht, die ein Byte zu lang ist, scheitert beim Schreiben, nachdem die Nutzerin oder der Nutzer das Telefon umsonst stillgehalten hat, und der Vergleich kostet nichts.

getCachedNdefMessage() kann auf einem Tag, der formatiert ist, aber noch keine Nachricht trägt, null zurückgeben, was die Referenz den initialisierten Zustand nennt. Das ist ein Tag, der zum Schreiben bereit ist, kein Tag, der nicht gelesen werden konnte.

Das Schreiben selbst

connect(), dann writeNdefMessage(), dann close(), auf einem Thread, der nicht der Hauptthread ist. Die Referenz zu Ndef kennzeichnet das Schreiben als blockierend und als Überschreiben dessen, was der Tag trug.

Ein leerer Tag geht stattdessen über NdefFormatable.format(), das ihn formatiert und eine erste Nachricht in einem Aufruf schreibt. Die Referenz beschreibt ein mehrstufiges Verfahren, das IOException auslöst, wenn irgendein Schritt scheitert, sodass eine Ausnahme sagt, dass das Verfahren angehalten hat, nicht wo.

Vier Ausnahmen verlangen vier Antworten. FormatException heißt, dass die Nachricht selbst fehlerhaft ist. TagLostException heißt, dass der Tag das Feld verlassen hat. IOException deckt andere Fehlschläge und einen Abbruch ab. SecurityException heißt, dass das Tag-Objekt veraltet ist und nach dem Verschwinden seines Tags benutzt wurde.

Nehmen Sie nach einer TagLostException nichts an. Lesen Sie den Tag erneut, bevor Sie es noch einmal versuchen, da das Schreiben abgeschlossen, gescheitert oder auf halbem Weg stehen geblieben sein kann, der Fall, den die Seite zum Abbruch auf halbem Weg von der Seite der Nutzerin oder des Nutzers behandelt.

Schreibschutz gilt in eine Richtung

makeReadOnly() setzt den Kapazitätsbehälter auf schreibgeschützt und, wo der Tag es zulässt, die Sperrbits dauerhaft. Die Referenz nennt es ein Verfahren in eine Richtung, das sich nicht rückgängig machen lässt.

Prüfen Sie zuerst canMakeReadOnly(), und hängen Sie den Aufruf nie an dieselbe Schaltfläche wie das Schreiben. NdefFormatable.formatReadOnly() tut beides in einem Aufruf, was die letzte Gelegenheit nimmt, den Inhalt zu prüfen, bevor er eingefroren wird.

Sperren Sie am Ende eines geprüften Durchlaufs, wenn überhaupt. Wann Sperren die richtige Entscheidung ist, behandelt die Seite zum Sperren.

Zurücklesen

Prüfen Sie mit getNdefMessage(), die den Tag liest, und nie mit der gemerkten Nachricht, die den Tag weiterhin so beschreibt, wie er vor dem Schreiben war.

Lesen Sie den Tag dann mit etwas anderem als Ihrem Code, und auf der anderen Plattform. Ein Fehler, der den falschen Datensatztyp schreibt, dekodiert ihn auf dieselbe falsche Weise, und ein iPhone kann einen Datensatz übergehen, den Ihr Android-Parser annimmt.

Häufige Fragen

Darf ein kleines Schreiben auf dem Hauptthread laufen?

Nein. Die Referenz kennzeichnet jedes Schreiben als blockierende Operation, die nicht auf dem Hauptthread laufen darf, unabhängig von ihrer Größe.

Warum löst writeNdefMessage eine FormatException aus?

Die Referenz löst sie aus, wenn die zu schreibende NDEF-Nachricht fehlerhaft ist, also liegt die Abhilfe in der Nachricht, nicht im Tag.

Funktioniert NdefFormatable auf jedem leeren Tag?

Nein. Es erscheint nur bei Tags, die das Telefon zu formatieren weiß, und die Referenz sagt, dass kein Satz von Tags geräteübergreifend vorgeschrieben ist.

Lässt sich ein schreibgeschützter Tag wieder beschreibbar machen?

Nein. Die Referenz beschreibt makeReadOnly als Verfahren in eine Richtung, das sich nicht rückgängig machen lässt.