का उपयोग कर एंड्रॉइड पर काम कर रहे एनएफसी को कैसे प्राप्त करें मैं क्यूटी के एनएफसी मॉड्यूल का उपयोग करके अपने एंड्रॉइड फोन पर एनएफसी टैग पढ़ने की कोशिश कर रहा हूं।Qt 5.6
इस page के अनुसार, क्यूटी संस्करण 5.6 से शुरू होने वाले एंड्रॉइड पर एनएफसी का समर्थन करेगा। यह संस्करण अभी तक जारी नहीं किया गया है, इसलिए मैंने इसे page पर दिए गए निर्देशों के बाद, स्रोत से बनाया है, और इसे Qt निर्माता में स्थापित किया है।
पहला कदम टैग/कार्ड का पता लगाने के लिए पहला कदम है और मैं वहां फंस गया हूं। मेरा टेस्ट एप्लिकेशन QNearFieldManager
को तुरंत चालू करता है, यह जांचता है कि क्या एनएफसी उपलब्ध है और सिग्नल targetDetected
और targetLost
पर स्लॉट कनेक्ट करता है। QNearFieldManager::isAvailable
विधि रिपोर्ट करता है कि एनएफसी उपलब्ध है (क्यूटी 5.5 के साथ यह नहीं था), लेकिन संकेत targetDetected
/targetLost
कभी नहीं निकाल दिए जाते हैं। कुछ
#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 फ़ाइल में की जरूरत है:
नीचे अपने परीक्षण आवेदन के कोड है संशोधित किया जाना चाहिए। मैंने अलग-अलग चीजों की कोशिश की, लेकिन कोई भी वांछित प्रभाव उत्पन्न नहीं कर रहा है। मैं केवल आग targetDetected
और targetLost
घटनाओं प्राप्त कर सकते हैं जब प्रकट इस तरह को कोई लक्ष्य फिल्टर परिभाषित करता है:,
<intent-filter>
<action android:name="android.nfc.action.TAG_DISCOVERED"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
बहरहाल, यह भी एप्लिकेशन हर बार एक लक्ष्य स्कैन किया जाता है शुरू किया जा करने का कारण बनता भी एप्लिकेशन अगर पहले से ही चल रहा है। मुझे ऐप शुरू करने की आवश्यकता है और फिर स्कैन किए जाने वाले लक्ष्य की प्रतीक्षा करें। मैं यह कैसे हासिल कर सकता हूं?
अद्यतन 2
नीचे पूर्ण AndroidManifest.xml फ़ाइल है कि मैं करने की कोशिश की है।
<?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>
क्या आपने यह सुनिश्चित करने के लिए [एंड्रॉइड दस्तावेज़] (https://developer.android.com/guide/topics/connectivity/nfc/nfc.html) जांच लिया है कि आपके पास सभी सही अनुमतियां सेट हैं? उदाहरण के लिए: '<उपयोग-अनुमति एंड्रॉइड: नाम =" android.permission।एनएफसी "/>' – jrossi
हां, अनुमतियां सही ढंग से सेट की गई हैं। जैसा कि मैंने उपरोक्त वर्णित किया है, लक्ष्य की उपस्थिति लक्ष्य को आग लगती है पता लगाया गया सिग्नल, मुझे लगता है कि अगर अनुमतियां सही नहीं थीं तो ऐसा नहीं होगा। समस्या यह है कि यह भी है ऐप का एक और उदाहरण लॉन्च करता है, जो इसे क्रैश करता है। मैं एक पल में अपनी पूर्ण एंड्रॉइडमैनीफेस्ट.एक्सएमएल फाइल पोस्ट करूंगा ... – Pat
क्या लॉगकट में कुछ दिलचस्प है? –