Kommentierte URL
Liest formatierte NFC Data Exchange Format (NDEF) Nachrichten.
Das Annotated URL Beispiel verwendet Qt NFC um den Inhalt von speziell formatierten NFC Data Exchange Format (NDEF) Nachrichten anzuzeigen, die von einem NFC Tag gelesen werden. Die NDEF-Nachricht sollte einen URI-Datensatz, einen optionalen image/*
MIME-Datensatz und einen oder mehrere lokalisierte Textsätze enthalten.
Dies ist der Ausgangszustand des Beispiels:
Wenn ein Tag berührt wird, wird sein NDEF-Inhalt angezeigt. Hier ist die Benutzeroberfläche für ein Tag, das einen Text- und einen URI-Datensatz enthält:
Wenn der Bildschirm angetippt wird, wird die URL im Browser geöffnet.
Definition der AnnotatedUrl-Klasse
Die Klasse AnnotatedUrl
umhüllt QNearFieldManager, die Klasse, die die NFC-Tag-Erkennungsfunktionalität bereitstellt. NDEF-Nachrichten werden von QNearFieldManager gelesen und an einen in der Klasse AnnotatedUrl
enthaltenen Handler weitergeleitet. Nach dem Parsen der NDEF-Nachricht gibt die Klasse das Signal annotatedUrl()
aus. Die Benutzeroberfläche reagiert auf das Signal und zeigt den Inhalt der NDEF-Nachricht an.
class AnnotatedUrl : public QObject { Q_OBJECT public: explicit AnnotatedUrl(QObject *parent = 0); ~AnnotatedUrl(); void startDetection(); signals: void annotatedUrl(const QUrl &url, const QString &title, const QPixmap &pixmap); void nfcStateChanged(bool enabled); void tagError(const QString &error); public slots: void targetDetected(QNearFieldTarget *target); void targetLost(QNearFieldTarget *target); void handleMessage(const QNdefMessage &message, QNearFieldTarget *target); void handlePolledNdefMessage(QNdefMessage message); void handleAdapterStateChange(QNearFieldManager::AdapterState state); private: QNearFieldManager *manager; QNdefFilter messageFilter; };
Hinweis: Die Methode startDetection()
wird verwendet, um die eigentliche Tag-Erkennung zu verschieben, bis alle Verbindungen zwischen der Benutzeroberfläche und der NFC-bezogenen Logik hergestellt sind. Dies ist wichtig, wenn die Anwendung automatisch gestartet wird, sobald ein NFC-Tag berührt wird. Dieser Anwendungsfall wird derzeit auf Android unterstützt.
int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow mainWindow; AnnotatedUrl annotatedUrl; QObject::connect(&annotatedUrl, &AnnotatedUrl::annotatedUrl, &mainWindow, &MainWindow::displayAnnotatedUrl); QObject::connect(&annotatedUrl, &AnnotatedUrl::nfcStateChanged, &mainWindow, &MainWindow::nfcStateChanged); QObject::connect(&annotatedUrl, &AnnotatedUrl::tagError, &mainWindow, &MainWindow::showTagError); annotatedUrl.startDetection(); mainWindow.show(); return a.exec(); }
Filtern von Nachrichten
Wie bereits erwähnt, unterstützt die Anwendung die NDEF-Nachrichten eines bestimmten Formats. Eine korrekte Nachricht sollte die folgenden Felder enthalten:
- Mindestens einen NDEF-Text-Datensatz, der als Kopfzeile verwendet wird.
- Genau einen NDEF-URI-Datensatz.
- Einen optionalen MIME-Datensatz mit einem Symbol.
Die Reihenfolge der Datensätze ist nicht genau festgelegt.
Eine Instanz von QNdefFilter wird zur Validierung der NDEF-Nachricht verwendet. Der Filter wird wie folgt ausgefüllt:
messageFilter.setOrderMatch(false); messageFilter.appendRecord<QNdefNfcTextRecord>(1, 100); messageFilter.appendRecord<QNdefNfcUriRecord>(1, 1); messageFilter.appendRecord(QNdefRecord::Mime, "", 0, 1);
Wenn die eingehende Nachricht nicht mit dem Filter übereinstimmt, wird eine Fehlermeldung angezeigt:
Hinweis: Die Beispielanwendung NDEF-Editor kann verwendet werden, um die Tags mit korrekter oder falscher Nachrichtenstruktur zu erstellen.
Implementierung des AnnotatedUrl-Handlers
Die von QNearFieldManager gelesenen NFC-Nachrichten werden an AnnotatedUrl::handleMessage
weitergeleitet.
void AnnotatedUrl::handleMessage(const QNdefMessage &message, QNearFieldTarget *target) {
Zunächst werden die Nachrichten mit der Methode QNdefFilter::match() validiert:
if (!messageFilter.match(message)) { emit tagError("Invalid message format"); return; }
Wenn die Nachrichten das richtige Format haben, wird das Parsing fortgesetzt.
Da NFC-Nachrichten aus mehreren NDEF-Datensätzen bestehen, ermöglicht das Durchlaufen aller Datensätze die Extraktion der drei Parameter, die in der Benutzeroberfläche angezeigt werden sollen: die Uri, der Titel und die Pixmap:
for (const QNdefRecord &record : message) { if (record.isRecordType<QNdefNfcTextRecord>()) { QNdefNfcTextRecord textRecord(record); title = textRecord.text(); QLocale locale(textRecord.locale()); } else if (record.isRecordType<QNdefNfcUriRecord>()) { QNdefNfcUriRecord uriRecord(record); url = uriRecord.uri(); } else if (record.typeNameFormat() == QNdefRecord::Mime && record.type().startsWith("image/")) { pixmap = QPixmap::fromImage(QImage::fromData(record.payload())); }
Nachdem die Parameter der NFC-Nachricht extrahiert wurden, wird das entsprechende Signal ausgegeben, damit die Benutzeroberfläche es verarbeiten kann.
} emit annotatedUrl(url, title, pixmap); }
Handhabung des Adapterstatus
Unter Android können die Zustandsänderungen des Adapters durch die Verbindung mit dem Signal QNearFieldManager::adapterStateChanged() erkannt werden. Dies ermöglicht es, die Erkennung zu stoppen, wenn der NFC-Adapter deaktiviert ist, und sie neu zu starten, wenn der Adapter wieder aktiviert wird. Dieser Ansatz ist im AnnotatedUrl::handleAdapterStateChange
Slot implementiert.
void AnnotatedUrl::handleAdapterStateChange(QNearFieldManager::AdapterState state) { if (state == QNearFieldManager::AdapterState::Online) { startDetection(); } else if (state == QNearFieldManager::AdapterState::Offline) { manager->stopTargetDetection(); emit nfcStateChanged(false); } }
Automatisches Starten von Anwendungen
Android unterstützt den automatischen Start der Anwendung, wenn das NDEF-Tag berührt wird. Siehe Qt NFC auf Android für die erforderlichen Änderungen an der Android-Manifestdatei.
Die Einführung einer benutzerdefinierten AndroidManifest.xml erfordert spezielle Schritte auf Seiten des Build-Systems.
Bauen mit qmake
Bei der Verwendung von qmake muss Folgendes zur Datei .pro
hinzugefügt werden:
android { ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android DISTFILES += \ android/AndroidManifest.xml }
Bauen mit CMake
Bei der Verwendung von CMake muss die Datei CMakeLists.txt
wie folgt ergänzt werden:
if(ANDROID) set_property(TARGET annotatedurl APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/android ) endif()
Ausführen des Beispiels
Zum Ausführen des Beispiels von Qt Creatorzu starten, öffnen Sie den Modus Welcome und wählen Sie das Beispiel aus Examples. Weitere Informationen finden Sie unter Erstellen und Ausführen eines Beispiels.
Siehe auch Qt NFC.
© 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.