Qt NFC の概要

Qt NFC API の典型的なユースケースは以下の通りです:

  • NFC タグの検出
  • NDEF メッセージの読み取りと書き込み
  • NDEF メッセージ・ハンドラの登録
  • ファイルやメッセージの共有

以下のセクションでは、上記のユースケースに対して Qt NFC C++ クラスや QML タイプを使用する方法について説明します。

注意: Android では、新しい NFC タグの検出はフォアグラウンド・アプリケーションでのみ 動作します。Android 側の API 制限により、Android サービスはこれをサポートしていません。サービス内でタグを使用する唯一の方法は、次の例に示すように、タグを受け入れるAIDLインターフェースを提供し、それを Qt に転送することです。

public void setTag(Tag pTag) {
    Intent newIntent = new Intent();
    newIntent.putExtra(NfcAdapter.EXTRA_TAG, pTag);
    QtNative.onNewIntent(newIntent);
}

C++の概要

C++ API は Qt NFC API の全機能へのアクセスを提供します。このセクションでは開発者が利用できる主な機能を紹介します。

NFC タグの検出

QNearFieldManager クラスはデバイスの範囲内に入った新しい NFC タグの検出を担当します。QNearFieldManager::targetDetected() およびQNearFieldManager::targetLost() 信号はタグが範囲に入ったり範囲から出たりするときに発せられます。渡されたQNearFieldTarget パラメータは、検出された各タグに対する一次相互作用点として機能します。QNearFieldManager::startTargetDetection() が呼び出されるまで、検出は実際には開始されない。

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);

最後に、検出を停止することができます:

m_manager->stopTargetDetection();

QNearFieldTarget インスタンスは、関連するQNearFieldManager インスタンスによって所有されているが、各インスタンスを手動で削除することは有益である。そうしないと、QNearFieldManager インスタンスが削除されるまで、それらは存在し続けることになる。これを行う最良の方法は、QNearFieldManager::targetLost() シグナルに応答することである:

void MainWindow::targetLost(QNearFieldTarget *target)
{
    target->deleteLater();
}

注: ターゲット・オブジェクトは、スロット内部で削除された場合のみ deleteLater()で削除する必要があります。

NFC タグの接続

接続を必要とするQNearFieldTarget のすべての関数は、自ら接続を作成します。アクティブな接続は、他のインスタンスが接続を作成するのを妨げます。

Qt 5 では、他のインスタンスが接続できるように、関数の最後でタグを切断します。QNearFieldManager::setKeepConnection() はこの動作を変更することができます。

Qt 6 以降、QNearFieldTarget はデフォルトで接続を保持します。接続が閉じられるのは、QNearFieldTarget が破棄されるか、QNearFieldManager::disconnect() が呼び出されたときだけです。

NDEF メッセージの読み書き

QNearFieldManager::targetDetected() シグナルによって返されるQNearFieldTarget インスタンスは、タグとの対話に使用されます。メッセージの読み書きは非同期操作です。QNearFieldTarget::RequestId クラスは、個々の操作とその結果を関連付けます。

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;
    }
}

QNearFieldTarget::readNdefMessages() 要求が正常に処理されると、QNearFieldTarget::ndefMessageRead() シグナルが発信されます。返された各QNdefMessage は、0個以上のQNdefRecord エントリで構成され、その型によって識別できる。レコード処理の詳細については、QNdefRecord クラスのドキュメントを参照のこと。上記のコードが示すように、NDEFメッセージの書き込みはQNearFieldTarget::writeNdefMessages ()を介してトリガーされる。書き込み操作の正常終了は、対応するリクエスト ID を持つQNearFieldTarget::requestCompleted() シグナルの発信によって示される。読み出し中や書き込み中に何らかのエラーが発生した場合は、QNearFieldTarget::error() を介して通知されます。

©2024 The Qt Company Ltd. 本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。