URL annotée
Lit les messages NFC Data Exchange Format (NDEF) formatés.
L'exemple d'URL annotée utilise Qt NFC pour afficher le contenu de messages NDEF (NFC Data Exchange Format) spécifiquement formatés, lus à partir d'une balise NFC. Le message NDEF doit contenir un enregistrement URI, un enregistrement MIME image/* facultatif et un ou plusieurs enregistrements texte localisés.
Il s'agit de l'état initial de l'exemple :

Si un tag est touché, son contenu NDEF sera affiché. Voici l'interface utilisateur d'une balise contenant un enregistrement texte et un enregistrement URI :

Lorsque l'on touche l'écran, l'URL s'ouvre dans le navigateur.
Définition de la classe AnnotatedUrl
La classe AnnotatedUrl englobe QNearFieldManager, la classe qui fournit la fonctionnalité de détection des balises NFC. Les messages NDEF sont lus par QNearFieldManager et transmis à un gestionnaire contenu dans la classe AnnotatedUrl. Après avoir analysé le message NDEF, la classe émet le signal annotatedUrl(). L'interface utilisateur réagit au signal en affichant le contenu du message NDEF.
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; };
Remarque : la méthode startDetection() est utilisée pour différer la détection de l'étiquette jusqu'à ce que toutes les connexions entre l'interface utilisateur et la logique NFC soient établies. Ceci est important lorsque l'application est automatiquement lancée dès qu'un tag NFC est touché. Ce cas d'utilisation est actuellement pris en charge par Android.
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(); }
Filtrage des messages
Comme indiqué ci-dessus, l'application prend en charge les messages NDEF d'un format spécifique. Un message correct doit contenir les champs suivants :
- Au moins un enregistrement NDEF Text, qui sera utilisé comme en-tête.
- Exactement un enregistrement NDEF URI.
- Un enregistrement MIMEfacultatif avec une icône.
L'ordre des enregistrements n'est pas strictement spécifié.
Une instance de QNdefFilter est utilisée pour valider le message NDEF. Le filtre est rempli comme suit :
messageFilter.setOrderMatch(false); messageFilter.appendRecord<QNdefNfcTextRecord>(1, 100); messageFilter.appendRecord<QNdefNfcUriRecord>(1, 1); messageFilter.appendRecord(QNdefRecord::Mime, "", 0, 1);
Si le message entrant ne correspond pas au filtre, un message d'erreur est affiché :

Note : L'application d'exemple NDEF Editor peut être utilisée pour créer les balises avec une structure de message correcte ou incorrecte.
Mise en œuvre du gestionnaire AnnotatedUrl
Les messages NFC lus par QNearFieldManager sont transmis à AnnotatedUrl::handleMessage.
void AnnotatedUrl::handleMessage(const QNdefMessage &message, QNearFieldTarget *target) {
Dans un premier temps, les messages sont validés à l'aide de la méthode QNdefFilter::match() :
if (!messageFilter.match(message)) { emit tagError("Invalid message format"); return; }
Si le format des messages est correct, l'analyse se poursuit.
Les messages NFC étant composés de plusieurs enregistrements NDEF, le fait de parcourir tous les enregistrements permet d'extraire les trois paramètres à afficher dans l'interface utilisateur : l'Uri, le titre et la carte pixel :
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())); }
Enfin, après avoir extrait les paramètres du message NFC, le signal correspondant est émis afin que l'interface utilisateur puisse le gérer.
}
emit annotatedUrl(url, title, pixmap);
}Gestion de l'état de l'adaptateur
Sur Android, les changements d'état de l'adaptateur peuvent être détectés en se connectant au signal QNearFieldManager::adapterStateChanged(). Cela permet d'arrêter la détection lorsque l'adaptateur NFC est désactivé et de la relancer lorsque l'adaptateur est à nouveau activé. Cette approche est mise en œuvre dans le slot AnnotatedUrl::handleAdapterStateChange.
void AnnotatedUrl::handleAdapterStateChange(QNearFieldManager::AdapterState state) { if (state == QNearFieldManager::AdapterState::Online) { startDetection(); } else if (state == QNearFieldManager::AdapterState::Offline) { manager->stopTargetDetection(); emit nfcStateChanged(false); } }
Démarrage automatique de l'application
Android prend en charge le démarrage automatique de l'application lorsque l'étiquette NDEF est touchée. Voir Qt NFC sur Android pour les changements requis dans le fichier manifeste d'Android.
L'introduction d'un fichier AndroidManifest.xml personnalisé nécessite des étapes spéciales du côté du système de construction.
Construction avec qmake
Lors de l'utilisation de qmake, les éléments suivants doivent être ajoutés au fichier .pro:
android {
ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android
DISTFILES += \
android/AndroidManifest.xml
}Construction avec CMake
Lors de l'utilisation de CMake, les éléments suivants doivent être ajoutés au fichier CMakeLists.txt:
if(ANDROID)
set_property(TARGET annotatedurl
APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
${CMAKE_CURRENT_SOURCE_DIR}/android
)
endif()Exécution de l'exemple
Pour exécuter l'exemple à partir de Qt CreatorOuvrez le mode Welcome et sélectionnez l'exemple à partir de Examples. Pour plus d'informations, voir Qt Creator: Tutorial : Construire et exécuter.
Voir aussi Qt NFC.
© 2026 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.