Qt NFC Überblick
Typische Anwendungsfälle mit der Qt NFC API sind:
- Erkennen von NFC-Tags.
- Lesen und Schreiben von NDEF-Nachrichten.
- Registrierung von NDEF-Nachrichten-Handlern.
- Gemeinsame Nutzung von Dateien und Nachrichten.
In den folgenden Abschnitten wird beschrieben, wie Qt NFC C++-Klassen und QML-Typen für die oben genannten Anwendungsfälle verwendet werden können.
Hinweis: Unter Android funktioniert die Erkennung neuer NFC-Tags nur in Anwendungen im Vordergrund. Android-Dienste unterstützen dies aufgrund von API-Beschränkungen auf der Android-Seite nicht. Die einzige Möglichkeit, ein Tag in einem Dienst zu verwenden, besteht darin, eine AIDL-Schnittstelle bereitzustellen, die das Tag akzeptiert und es an Qt weiterleitet, wie im folgenden Beispiel gezeigt.
public void setTag(Tag pTag) { Intent newIntent = new Intent(); newIntent.putExtra(NfcAdapter.EXTRA_TAG, pTag); QtNative.onNewIntent(newIntent); }
C++ Überblick
Die C++-API bietet Zugriff auf den vollen Funktionsumfang der Qt NFC API. In diesem Abschnitt werden die wichtigsten Funktionen vorgestellt, die den Entwicklern zur Verfügung stehen.
Erkennung von NFC-Tags
Die Klasse QNearFieldManager ist für die Erkennung von neuen NFC-Tags zuständig, die in Reichweite des Geräts kommen. Die Signale QNearFieldManager::targetDetected() und QNearFieldManager::targetLost() werden ausgesendet, wenn ein Tag in den Bereich kommt oder ihn verlässt. Der übergebene Parameter QNearFieldTarget dient als primärer Interaktionspunkt für jedes erkannte Tag. Die Erkennung beginnt jedoch erst, wenn QNearFieldManager::startTargetDetection() aufgerufen wurde.
m_manager = new QNearFieldManager(this); connect(m_manager, &QNearFieldManager::targetDetected, this, &MainWindow::targetDetected); connect(m_manager, &QNearFieldManager::targetLost, this, &MainWindow::targetLost); m_manager->startTargetDetection(QNearFieldTarget::NdefAccess);
Schließlich kann die Erkennung gestoppt werden:
m_manager->stopTargetDetection();
Obwohl jede QNearFieldTarget -Instanz im Besitz der zugehörigen QNearFieldManager -Instanz ist, kann es von Vorteil sein, jede Instanz manuell zu löschen. Andernfalls würden sie weiter existieren, bis die Instanz QNearFieldManager gelöscht wird. Der beste Weg, dies zu tun, wäre als Antwort auf das Signal QNearFieldManager::targetLost():
void MainWindow::targetLost(QNearFieldTarget *target) { target->deleteLater(); }
Hinweis: Das Zielobjekt sollte nur über deleteLater() gelöscht werden, wenn es innerhalb des Slots gelöscht wird.
Verbinden von NFC-Tags
Alle Funktionen von QNearFieldTarget, die eine Verbindung benötigen, stellen selbst eine her. Eine aktive Verbindung verhindert, dass andere Instanzen eine Verbindung herstellen können, da nur eine Verbindung zur Zeit erlaubt ist.
Qt 5 trennt die Verbindung zum Tag am Ende der Funktionen, um anderen Instanzen die Verbindung zu ermöglichen. QNearFieldManager::setKeepConnection() erlaubt es, dieses Verhalten zu ändern.
Seit Qt 6 behält QNearFieldTarget die Verbindung standardmäßig bei. Die Verbindung wird nur geschlossen, wenn QNearFieldTarget zerstört oder QNearFieldManager::disconnect() aufgerufen wird.
Lesen und Schreiben von NDEF-Nachrichten
Die Instanz QNearFieldTarget, die vom Signal QNearFieldManager::targetDetected() zurückgegeben wird, wird zur Interaktion mit dem Tag verwendet. Das Lesen und Schreiben einer Nachricht ist ein asynchroner Vorgang. Die Klasse QNearFieldTarget::RequestId assoziiert einzelne Operationen und deren Ergebnisse.
void MainWindow::targetDetected(QNearFieldTarget *target) { switch (m_touchAction) { case NoAction: break; case ReadNdef: connect(target, &QNearFieldTarget::ndefMessageRead, this, &MainWindow::ndefMessageRead); connect(target, &QNearFieldTarget::error, this, &MainWindow::targetError); m_request = target->readNdefMessages(); if (!m_request.isValid()) // cannot read messages targetError(QNearFieldTarget::NdefReadError, m_request); break; case WriteNdef: connect(target, &QNearFieldTarget::requestCompleted, this, &MainWindow::ndefMessageWritten); connect(target, &QNearFieldTarget::error, this, &MainWindow::targetError); m_request = target->writeNdefMessages(QList<QNdefMessage>() << ndefMessage()); if (!m_request.isValid()) // cannot write messages targetError(QNearFieldTarget::NdefWriteError, m_request); break; } }
Sobald die Anfrage QNearFieldTarget::readNdefMessages() erfolgreich verarbeitet wurde, wird das Signal QNearFieldTarget::ndefMessageRead() ausgegeben. Jede zurückgegebene QNdefMessage kann aus null oder mehr QNdefRecord Einträgen bestehen, die durch ihren Typ identifiziert werden können. Weitere Informationen über die Verarbeitung von Einträgen finden Sie in der Dokumentation der Klasse QNdefRecord. Wie der obige Code zeigt, wird das Schreiben von NDEF-Nachrichten über QNearFieldTarget::writeNdefMessages() ausgelöst. Der erfolgreiche Abschluss des Schreibvorgangs wird durch die Ausgabe des Signals QNearFieldTarget::requestCompleted() mit der entsprechenden Request-ID angezeigt. Jede Art von Fehler beim Lesen oder Schreiben wird über QNearFieldTarget::error() angezeigt.
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.