Sur cette page

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 :

URL annoté Écran principal NFC

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 :

URL annotée Détails de l'étiquette NFC

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é :

URL annotée Vue des données de l'étiquette NFC

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.

Exemple de projet @ code.qt.io

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.