Annotated URL Example

The Annotated URL example displays the contents of specifically formatted NFC Data Exchange Format (NDEF) messages read from an NFC Tag. The NDEF message should contain a URI record, an optional image/* MIME record, and one or more localized Text records.

This is the initial state of the example:

In this example the NFC Tag used contains a text record. The UI gets updated accordingly to:

AnnotatedUrl Class Definition

The AnnotatedUrl class wraps the QNearFieldManager, the class providing the NFC Tag detection functionality. NDEF messages are read by the QNearFieldManager and forwarded to a handler contained in the AnnotatedUrl class. After parsing the NDEF message the class emits the signal AnnotatedUrl::annotatedUrl(const QUrl &url, const QString &title, const QPixmap &pixmap). The UI reacts to the signal displaying the contents of the NDEF message.


  class AnnotatedUrl : public QObject
  {
      Q_OBJECT

  public:
      explicit AnnotatedUrl(QObject *parent = 0);
      ~AnnotatedUrl();

  signals:
      void annotatedUrl(const QUrl &url, const QString &title, const QPixmap &pixmap);

  public slots:
      void targetDetected(QNearFieldTarget *target);
      void targetLost(QNearFieldTarget *target);
      void handleMessage(const QNdefMessage &message, QNearFieldTarget *target);
      void handlePolledNdefMessage(QNdefMessage message);
  private:
      QNearFieldManager *manager;
  };

AnnotatedUrl Handler Implementation

NFC messages read by the QNearFieldManager are forwarded to AnnotatedUrl::handleMessage. The callback signature details can be read in QNearFieldManager::registerNdefMessageHandler.


  void AnnotatedUrl::handleMessage(const QNdefMessage &message, QNearFieldTarget *target)
  {

Because NFC messages are composed of several NDEF records, looping through all of the records allows the extraction of the 3 parameters to be displayed in the UI: the Uri, the Title and the Pixmap:


      foreach (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()));
          }

Finally after having extracted the parameters of the NFC message the corresponding signal is emitted so that the UI can handle it.


      }

      emit annotatedUrl(url, title, pixmap);
  }

Running the Example

To run the example from Qt Creator, open the Welcome mode and select the example from Examples. For more information, visit Building and Running an Example.

Files:

See also Qt NFC.