Zum Inhalt springen
Sprache: DE

Wie deklariert man die Tags, die eine Android-Anwendung empfangen soll?

Mit Absichtsfiltern im Manifest, in fester Reihenfolge geprüft: NDEF-Inhalt zuerst, dann Technologielisten. Filtern Sie auf den Inhalt, den Ihre Anwendung behandelt, in Kleinbuchstaben. Zwei neuere Änderungen entscheiden, ob überhaupt etwas ankommt: Weblinks gehen ab Android 16 an ACTION_VIEW, und Android 17 verlangt die NFC-Zustellberechtigung auf der Aktivität.

Drei Ebenen, ein Gewinner

Zwei Deklarationen kommen vor jedem Filter: die Berechtigung android.permission.NFC und, für eine Anwendung, die ohne NFC nutzlos ist, die als erforderlich gekennzeichnete Funktion android.hardware.nfc, mit der Google Play die Anwendung vor Telefonen ohne die Hardware verbirgt.

Der Leitfaden zu den NFC-Grundlagen führt dann drei Zustellabsichten vom höchsten zum niedrigsten Vorrang auf: ACTION_NDEF_DISCOVERED für einen Tag, dessen NDEF-Inhalt sich einem Typ zuordnen lässt, ACTION_TECH_DISCOVERED, wenn keine Aktivität die erste behandelt, und ACTION_TAG_DISCOVERED als letzten Ausweg.

Die Zustellung hält auf der ersten Ebene an, auf der eine Aktivität passt. Passen mehrere auf dieser Ebene, bekommt die Nutzerin oder der Nutzer eine Auswahl, die die Referenz zu Tag als das Ergebnis darstellt, das der Entwurf zu vermeiden sucht, da das Bewegen des Telefons zum Auswählen die Verbindung meist abreißen lässt.

Die NDEF-Ebene liest einen Datensatz. Dieselbe Referenz sagt, dass das System den ersten Datensatz der ersten Nachricht prüft, sodass eine Nachricht, die mit einem Datensatz beginnt, den Ihre Anwendung übergeht, für die Zustellung eine Nachricht über etwas anderes ist.

Als was der erste Datensatz zugestellt wird
Erster DatensatzZugestellt als
Wohlbekannter Typ, URIEine aus der Nutzlast gebaute URI
Wohlbekannter Typ, TextDer MIME-Typ text/plain
MIME-MediumDer MIME-Typ, den der Datensatz angibt
Absolute URIEine aus dem Typfeld gebaute URI
Externer TypEine URI, die mit vnd.android.nfc://ext/ beginnt
Leer, unbekannt oder unverändertNichts: die Zustellung fällt auf Technologien zurück

Auf Inhalt filtern

Ein Filter für ACTION_NDEF_DISCOVERED benennt die Aktion, die Kategorie DEFAULT und ein data-Element: einen MIME-Typ, oder ein Schema mit Host und Pfad.

Schreiben Sie jeden Teil klein. Die Referenz zu IntentFilter hält fest, dass MIME-Typ, Schema und Host als Groß- und Kleinschreibung unterschieden werden, anders als in den zugrunde liegenden RFC. Wird ein Datensatz auf eine URI abgebildet, sagt die Referenz zu NdefRecord, dass das Schema kleingeschrieben wird, und sagt nichts zum Host, sodass ein Tag mit groß geschriebenem Host einen klein geschriebenen Filter verfehlen kann.

Filtern Sie auf das, was Ihre Anwendung behandelt, und auf nichts Weiteres. Das Beispiel zur Vordergrund-Zustellung im Leitfaden zu fortgeschrittenem NFC trägt jeden MIME-Typ ein, mit einem Kommentar, der bittet, nur die nötigen zu benennen, und ein zu weiter Filter stellt die Anwendung in die Auswahl für Tags, mit denen sie nichts anfangen kann.

Die größte neuere Änderung betrifft den häufigsten Tag. Ab Android 16, hält der Leitfaden zu den NFC-Grundlagen fest, löst ein Tag mit einem http- oder https-Link ACTION_VIEW aus statt ACTION_NDEF_DISCOVERED.

Ab Android 17 zeigt derselbe Tag zuerst eine Mitteilung zum Öffnen des Links, und der Link öffnet sich erst, wenn die Nutzerin oder der Nutzer darauf eingeht.

Eine Anwendung, die über ACTION_NDEF_DISCOVERED auf ihre eigene https-Adresse filterte, bekommt diese Tags auf diesen Versionen also nicht mehr. Die Dokumentation verweist auf Android App Links, um eine Anwendung aus einem solchen Link zu öffnen.

Die Änderung ist auf http und https begrenzt. Die Dokumentation beschreibt nichts Vergleichbares für MIME-Datensätze, externe Typen oder andere Schemata, die weiter über die NDEF-Ebene gehen.

Technologielisten

ACTION_TECH_DISCOVERED braucht einen Absichtsfilter und einen meta-data-Eintrag, der auf eine XML-Ressource aus tech-list-Elementen zeigt. Die Referenz zu NfcAdapter nennt die Logik deutlich: jede Technologie innerhalb einer tech-list muss vorhanden sein, und eine einzige passende tech-list genügt.

Benennen Sie nur Klassen, die jedes Zieltelefon bereitstellt. Die Referenz zu TagTechnology macht MifareClassic, MifareUltralight und NfcBarcode optional, und ein Telefon, dem eine davon fehlt, führt sie nie auf, sodass eine Technologieliste, die sie verlangt, auf diesem Telefon nie passt und nichts darüber berichtet.

Was Android 16 und 17 verlangen

Ab Android 17 muss eine Anwendung, die ein SDK oberhalb von Android 16 anvisiert, jede Aktivität, die NFC-Absichten empfängt, mit android.permission.DISPATCH_NFC_MESSAGE schützen, damit nur der NFC-Systemdienst sie starten kann. Dieselbe Stelle ergänzt, dass das System keine NFC-Absichten an eine Anwendung im angehaltenen Zustand zustellt: nie von der Nutzerin oder dem Nutzer gestartet, oder zwangsweise beendet.

Ab Android 16 können Nutzerinnen und Nutzer Tag-Absichten anwendungsweise ablehnen. isTagIntentAppPreferenceSupported() sagt, ob das Telefon die Einstellung anbietet, isTagIntentAllowed(), ob Ihre Anwendung erlaubt geblieben ist, und ACTION_CHANGE_TAG_INTENT_PREFERENCE öffnet die Seite, auf der sich das ändern lässt.

Und ACTION_TAG_DISCOVERED, die Auffangebene, ist ab Android 17 veraltet, womit Inhaltsfilter und Technologielisten die beiden unterstützten Wege bleiben.

Häufige Fragen

Warum greift mein NDEF-Filter nie?

Prüfen Sie die Groß- und Kleinschreibung von MIME-Typ, Schema und Host, dann den ersten Datensatz auf dem Tag. Ab Android 16 prüfen Sie, ob der Tag einen Weblink trägt, und ab Android 17, ob die Aktivität die Zustellberechtigung führt.

Warum erscheint eine Auswahl, obwohl meine Anwendung installiert ist?

Eine andere Anwendung passt auf derselben Ebene. Grenzen Sie Ihren Filter auf Inhalt ein, den nur Ihre Anwendung behandelt, oder benennen Sie Ihre Anwendung mit einem Android Application Record auf dem Tag.

Ersetzt ein Android Application Record die Absichtsfilter?

Nein. Das System versucht zuerst die Absichtsfilter. Gehört die passende Aktivität nicht zur benannten Anwendung, oder passen mehrere, startet es stattdessen die benannte Anwendung und öffnet Google Play, wenn sie nicht installiert ist.

Kann meine Anwendung einen Tag mit Weblink noch empfangen?

Über Android App Links, auf die die Dokumentation ab Android 16 verweist. Ein NDEF-Filter auf die https-Adresse empfängt den Tag nicht mehr, und ab Android 17 wartet der Link auf eine Handlung an einer Mitteilung.