当前位置: 首页 > 知识库问答 >
问题:

如何使用Qt5.6使NFC在Android上运行

慕河
2023-03-14

我正在尝试使用QT的NFC模块读取我的Android手机上的NFC标签。

根据这一页面,Qt将从5.6版本开始在Android上支持NFC。这个版本还没有发布,所以我按照本页上的说明,从源代码处构建了它,并将它安装在Qt Creator中。

#include <QLabel>
#include <QVBoxLayout>

#include <QNearFieldManager>
#include <QNearFieldTarget>

#include <QDebug>

#include "window.h"

Window::Window(QWidget *parent)
: QWidget(parent)
{
    nfcLabel_ = new QLabel(this);

    QVBoxLayout *mainLayout = new QVBoxLayout;
    mainLayout->addWidget(nfcLabel_, 1);

    setLayout(mainLayout);

    setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));

    setWindowTitle(tr("NFC Test"));

    nfc_ = new QNearFieldManager(this);
    if (nfc_->isAvailable()) {
        nfcLabel_->setText("NFC available");
    } else {
        nfcLabel_->setText("NFC not available");
        qWarning() << "NFC not available";
    }

    nfc_->setTargetAccessModes(QNearFieldManager::NdefReadTargetAccess); // doesn't help

    nfc_->registerNdefMessageHandler(this, SLOT(handleNdefMessage(QNdefMessage,QNearFieldTarget*))); // doesn't help

    connect(nfc_, SIGNAL(targetDetected(QNearFieldTarget*)), this, SLOT(targetDetected(QNearFieldTarget*)));
    connect(nfc_, SIGNAL(targetLost(QNearFieldTarget*)), this, SLOT(targetLost(QNearFieldTarget*)));

    if (!nfc_->startTargetDetection()) {
        qWarning() << "NFC target detection could not be started";
    }
}

Window::~Window()
{
    nfc_->stopTargetDetection();
}

void Window::targetDetected(QNearFieldTarget * /*target*/)
{
    nfcLabel_->setText("Target detected");
}

void Window::targetLost(QNearFieldTarget *target)
{
    nfcLabel_->setText("Target lost");
    target->deleteLater();
}

void Window::handleNdefMessage(const QNdefMessage &/*message*/, QNearFieldTarget */*target*/)
{
    qDebug() << "Ndef Message";
}

我一定是错过了什么...

更新1

似乎需要修改AndroidManifest.xml文件。我尝试了不同的方法,但似乎都没有产生预期的效果。只有当清单定义如下所示的意图筛选器时,我才能获取TargetDetectedTargetLoster事件来激发:

<intent-filter>
    <action android:name="android.nfc.action.TAG_DISCOVERED"/>
    <category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<?xml version="1.0"?>
<manifest package="org.qtproject.example" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="1.0" android:versionCode="1" android:installLocation="auto">
    <application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="-- %%INSERT_APP_NAME%% --" android:theme="@android:style/Theme.Holo">
    <activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation" android:name="org.qtproject.qt5.android.bindings.QtActivity" android:label="-- %%INSERT_APP_NAME%% --" android:screenOrientation="unspecified" android:launchMode="singleTop">
        <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>

        <!-- Without this, the targetDetected/targetLost signals aren't fired -->
        <intent-filter>
        <action android:name="android.nfc.action.TAG_DISCOVERED"/>
        <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>

        <meta-data android:name="android.app.lib_name" android:value="-- %%INSERT_APP_LIB_NAME%% --"/>
        <meta-data android:name="android.app.qt_sources_resource_id" android:resource="@array/qt_sources"/>
        <meta-data android:name="android.app.repository" android:value="default"/>
        <meta-data android:name="android.app.qt_libs_resource_id" android:resource="@array/qt_libs"/>
        <meta-data android:name="android.app.bundled_libs_resource_id" android:resource="@array/bundled_libs"/>
        <!-- Deploy Qt libs as part of package -->
        <meta-data android:name="android.app.bundle_local_qt_libs" android:value="-- %%BUNDLE_LOCAL_QT_LIBS%% --"/>
        <meta-data android:name="android.app.bundled_in_lib_resource_id" android:resource="@array/bundled_in_lib"/>
        <meta-data android:name="android.app.bundled_in_assets_resource_id" android:resource="@array/bundled_in_assets"/>
        <!-- Run with local libs -->
        <meta-data android:name="android.app.use_local_qt_libs" android:value="-- %%USE_LOCAL_QT_LIBS%% --"/>
        <meta-data android:name="android.app.libs_prefix" android:value="/data/local/tmp/qt/"/>
        <meta-data android:name="android.app.load_local_libs" android:value="-- %%INSERT_LOCAL_LIBS%% --"/>
        <meta-data android:name="android.app.load_local_jars" android:value="-- %%INSERT_LOCAL_JARS%% --"/>
        <meta-data android:name="android.app.static_init_classes" android:value="-- %%INSERT_INIT_CLASSES%% --"/>
        <!--  Messages maps -->
        <meta-data android:value="@string/ministro_not_found_msg" android:name="android.app.ministro_not_found_msg"/>
        <meta-data android:value="@string/ministro_needed_msg" android:name="android.app.ministro_needed_msg"/>
        <meta-data android:value="@string/fatal_error_msg" android:name="android.app.fatal_error_msg"/>
        <!--  Messages maps -->

        <!-- Splash screen -->
        <!--
        <meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/logo"/>
        -->
        <!-- Splash screen -->

        <!-- Background running -->
        <!-- Warning: changing this value to true may cause unexpected crashes if the
              application still try to draw after
              "applicationStateChanged(Qt::ApplicationSuspended)"
              signal is sent! -->
        <meta-data android:name="android.app.background_running" android:value="false"/>
        <!-- Background running -->
    </activity>
    </application>
    <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="14"/>
    <supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>
    <uses-feature android:name="android.hardware.nfc" android:required="true"/>
    <uses-permission android:name="android.permission.NFC"/>
</manifest>

共有1个答案

狄望
2023-03-14

如果您使用的是某个制造商的NFC标签,同样应该存在于移动NFC中,那么只有它将正确配对,目前NFC全球不支持。为。如果索尼设备内部的NFC将最大限度地支持它的生产,在大多数情况下,它无法连接到其他设备,如Nexus。所以试着找到你的制造商,并把它连接起来。希望对你有帮助…

 类似资料:
  • 问题内容: 在浏览Android WebView文档时遇到了ServiceWorkerController,并决定尝试一下。不幸的是,我无法截获任何电话。我知道WebViewClient.shouldInterceptRequest,但有兴趣了解有关ServiceWorkerController的更多信息。不幸的是,这些文档比我下面已经实现的稀疏。任何帮助,将不胜感激。 我整理了一个由单个Acti

  • 我有ntag213,使用react-native-nfc-Manager和andriod一起使用,在我的标签留档https://www.nxp.com/docs/en/data-sheet/NTAG213_215_216.pdf我知道首先我需要验证命令0x1B0x2B和我的密码:0xFF1FFFFF

  • 我正在尝试在使用NFC的设备上设置设备所有者包。在这里的Lollipop概述中提到: 它似乎意识到了它正在接收一个提供请求的事实,但我不认为它正在读取我设置的属性,它没有尝试连接WiFi。

  • 我正在开发一个用于从MIFARE标签读取和写入数据的应用程序。我买了一个可以使用NFC技术读取和写入MIFARE标签操作的设备。 NFC屏蔽 我一直在使用MIFARE ultralight标签,但在尝试验证特定内存地址时遇到了问题。由于这个原因,我不能开始阅读。这是我的Arduino代码: 此读取代码是为Arduino Mega 2560和Seeedstudio NFC Shield v1.0和M

  • 问题内容: 几天来,我们有了JDK8。我试图用SPDY服务器运行Jetty。在JDK8中,没有NPN支持,因此其结尾为: 我已经npn-boot-1.1.6.v20130911.jar在可与最新JDK7一起使用的CLASSPATH上运行它。 关于如何在JDK8上使用SPDY运行Jetty有任何解决方法? 问题答案: 与以前的Java版本一样,Java 11中没有Public JRE。不要与jre以

  • 问题内容: 我回到了带有Jetty和SPDY的JDK8,并且看到现在Jetty9.2支持ALPN协议而不是NPN(请参阅我的问题如何在JDK8上使用SPDY运行Jetty?)。所以我设置了: 但是现在我有了例外: 我使用和码头9.2.2.v20140723。 我从JDK 1.7和WinXP 遇到的相同错误,如果从 此执行在我的代码中指向: 似乎即使使用ALPN码头,也需要npn-boot中的类。是