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 ()を介して示されます。

© 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.