93 if (!hasNdefMessage())
94 return QNearFieldTarget::RequestId();
97 QNearFieldTarget::RequestId requestId(
new QNearFieldTarget::RequestIdPrivate);
98 if (!targetIntent.isValid()) {
99 reportError(QNearFieldTarget::TargetOutOfRangeError, requestId);
105 reportError(QNearFieldTarget::UnsupportedError, requestId);
111 reportError(QNearFieldTarget::ConnectionError, requestId);
116 QJniObject ndefMessage = tagTech.callMethod<QtJniTypes::NdefMessage>(
"getNdefMessage");
117 if (!ndefMessage.isValid()) {
118 reportError(QNearFieldTarget::NdefReadError, requestId);
122 QByteArray ndefMessageQBA = ndefMessage.callMethod<jbyte[]>(
"toByteArray").toContainer();
125 QNdefMessage qNdefMessage = QNdefMessage::fromByteArray(ndefMessageQBA);
126 QMetaObject::invokeMethod(
this, [
this, qNdefMessage]() {
127 Q_EMIT
this->q_ptr->ndefMessageRead(qNdefMessage);
128 }, Qt::QueuedConnection);
129 QMetaObject::invokeMethod(
this, [
this, requestId]() {
130 Q_EMIT
this->requestCompleted(requestId);
131 }, Qt::QueuedConnection);
132 QMetaObject::invokeMethod(
this, [
this, qNdefMessage, requestId]() {
135 Q_EMIT
this->ndefMessageRead(qNdefMessage, requestId);
136 }, Qt::QueuedConnection);
162 if (maxLength == 0) {
169 Q_EMIT error(QNearFieldTarget::ConnectionError, QNearFieldTarget::RequestId());
170 return QNearFieldTarget::RequestId();
173 if (command.size() == 0 || command.size() > maxLength) {
174 Q_EMIT error(QNearFieldTarget::InvalidParametersError, QNearFieldTarget::RequestId());
175 return QNearFieldTarget::RequestId();
179 if (!(accessMethods() & QNearFieldTarget::TagTypeSpecificAccess))
180 return QNearFieldTarget::RequestId();
185 Q_EMIT error(QNearFieldTarget::UnsupportedError, QNearFieldTarget::RequestId());
186 return QNearFieldTarget::RequestId();
190 QNearFieldTarget::RequestId requestId = QNearFieldTarget::RequestId(
new QNearFieldTarget::RequestIdPrivate());
192 reportError(QNearFieldTarget::ConnectionError, requestId);
197 const QJniArray myNewVal = tagTech.callMethod<jbyte[]>(
"transceive", command);
198 if (!myNewVal.isValid()) {
205 reportError(QNearFieldTarget::CommandError, requestId);
208 QByteArray result = myNewVal.toContainer();
210 setResponseForRequest(requestId, result,
false);
212 QMetaObject::invokeMethod(
this, [
this, requestId]() {
213 Q_EMIT
this->requestCompleted(requestId);
214 }, Qt::QueuedConnection);
221 if (messages.size() == 0)
222 return QNearFieldTarget::RequestId();
224 if (messages.size() > 1)
225 qWarning(
"QNearFieldTarget::writeNdefMessages: Android supports writing only one NDEF message per tag.");
228 const char *writeMethod;
231 return QNearFieldTarget::RequestId();
235 writeMethod =
"format";
237 writeMethod =
"writeNdefMessage";
240 QNearFieldTarget::RequestId requestId = QNearFieldTarget::RequestId(
new QNearFieldTarget::RequestIdPrivate());
242 reportError(QNearFieldTarget::ConnectionError, requestId);
248 QtJniTypes::NdefMessage jmessage(message.toByteArray());
249 if (!jmessage.isValid()) {
250 reportError(QNearFieldTarget::UnknownError, requestId);
256 env.findMethod<
void, QtJniTypes::NdefMessage>(tagTech.objectClass(), writeMethod);
258 env->CallVoidMethod(tagTech.object(), methodId, jmessage.object<jobject>());
259 if (!methodId || env.checkAndClearExceptions()) {
260 reportError(QNearFieldTarget::NdefWriteError, requestId);
264 QMetaObject::invokeMethod(
this, [
this, requestId]() {
265 Q_EMIT
this->requestCompleted(requestId);
266 }, Qt::QueuedConnection);
287 if (!targetIntent.isValid() || !setTagTechnology({selectedTech})) {
293 bool connected =
false;
294 auto methodId = env.findMethod<jboolean>(tagTech.objectClass(),
"isConnected");
296 connected = env->CallBooleanMethod(tagTech.object(), methodId);
297 if (!methodId || env.checkAndClearExceptions()) {
305 methodId = env.findMethod<
void>(tagTech.objectClass(),
"connect");
307 env->CallVoidMethod(tagTech.object(), methodId);
308 if (!methodId || env.checkAndClearExceptions(QJniEnvironment::OutputMode::Silent)) {
312 methodId = env.findMethod<
void>(tagTech.objectClass(),
"close");
314 env->CallVoidMethod(tagTech.object(), methodId);
315 if (!methodId || env.checkAndClearExceptions(QJniEnvironment::OutputMode::Silent))
328 if (!targetIntent.isValid())
333 QJniObject tag = QtNfc::getTag(targetIntent);
334 Q_ASSERT_X(tag.isValid(),
"updateTechList",
"could not get Tag object");
336 const QJniArray techListArray = tag.callMethod<QtJniTypes::String[]>(
"getTechList");
337 if (!techListArray.isValid()) {
344 for (
const auto &tech : techListArray)
345 techList.append(tech.toString());
357 QString qtype = ndef.callMethod<jstring>(
"getType").toString();
360 return QNearFieldTarget::MifareTag;
362 return QNearFieldTarget::NfcTagType1;
364 return QNearFieldTarget::NfcTagType2;
366 return QNearFieldTarget::NfcTagType3;
368 return QNearFieldTarget::NfcTagType4;
369 return QNearFieldTarget::ProprietaryTag;
372 return QNearFieldTarget::MifareTag;
377 const QByteArray atqaQBA = nfca.callMethod<QByteArray>(
"getAtqa");
378 if (atqaQBA.isEmpty())
379 return QNearFieldTarget::ProprietaryTag;
380 if ((atqaQBA[0] & 0x1F) == 0x00)
381 return QNearFieldTarget::NfcTagType1;
386 jshort sakS = nfca.callMethod<jshort>(
"getSak");
387 if ((sakS & 0x0064) == 0x0000)
388 return QNearFieldTarget::NfcTagType2;
389 else if ((sakS & 0x0064) == 0x0020)
390 return QNearFieldTarget::NfcTagType4A;
391 return QNearFieldTarget::ProprietaryTag;
393 return QNearFieldTarget::NfcTagType4B;
395 return QNearFieldTarget::NfcTagType3;
398 return QNearFieldTarget::ProprietaryTag;
417 QString techClass(tech);
418 techClass.replace(QLatin1Char(
'.'), QLatin1Char(
'/'));
421 QJniObject tag = QtNfc::getTag(targetIntent);
422 Q_ASSERT_X(tag.isValid(),
"getTagTechnology",
"could not get Tag object");
424 const QString sig = QString::fromUtf8(
"(Landroid/nfc/Tag;)L%1;");
425 QJniObject tagTech = QJniObject::callStaticObjectMethod(techClass.toUtf8().constData(),
"get",
426 sig.arg(techClass).toUtf8().constData(), tag.object<jobject>());
475 if (!tagTech.isValid())
479 auto methodId = env.findMethod<
void, jint>(tagTech.objectClass(),
"setTimeout");
481 env->CallVoidMethod(tagTech.object(), methodId, timeout);
482 return methodId && !env.checkAndClearExceptions();