Android 写入 NFC 代码导致 "unknown content" 类型
Android writing NFC code leads to "unknown content" type
我根据示例制作了一个应用程序,用于在 Android 上编写 NFC 代码。我的标签是 NXP NTAG216。
但我有一个问题:用我的应用程序编写标签后,NXP 的 TagWriter 应用程序将数据显示为 "unknown content",如下所示:
但是,当我使用 NXP TagWriter 将值写入 "Plain Text" 时,我得到:
这是我的 onNewIntent 代码:
@Override
protected void onNewIntent(Intent intent) {
// Tag writing mode
String zawartosc = "Data from field";
if (mWriteMode && NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
NdefRecord record = NdefRecord.createMime(zawartosc, zawartosc.getBytes(Charset.forName("UTF-8")));
NdefMessage message = new NdefMessage(new NdefRecord[]{record});
if (writeTag(message, detectedTag)) {
Toast.makeText(this, "Success", Toast.LENGTH_LONG)
.show();
}
}
}
写标签:
public boolean writeTag(NdefMessage message, Tag tag) {
int size = message.toByteArray().length;
try {
Ndef ndef = Ndef.get(tag);
if (ndef != null) {
ndef.connect();
if (!ndef.isWritable()) {
Toast.makeText(getApplicationContext(),
"Unwritable",
Toast.LENGTH_SHORT).show();
return false;
}
if (ndef.getMaxSize() < size) {
Toast.makeText(getApplicationContext(),
"Text is too short",
Toast.LENGTH_SHORT).show();
return false;
}
ndef.writeNdefMessage(message);
return true;
} else {
NdefFormatable format = NdefFormatable.get(tag);
if (format != null) {
try {
format.connect();
format.format(message);
return true;
} catch (IOException e) {
return false;
}
} else {
return false;
}
}
} catch (Exception e) {
return false;
}
}
有没有办法以某种方式将内容类型更改为 NXP TagWriter 写入的内容类型?当它是未知类型时,我在稍后正确阅读代码时遇到问题。
你得到的正是你写入标签的内容,一个 MIME 类型的记录,其值设置为 UTF-8 编码的字符串“{number_id:"test12"}”和 MIME type 设置为完全相同(且无效!)的值。您在创建 MIME 类型记录期间执行了此操作:
NdefRecord record = NdefRecord.createMime(zawartosc, zawartosc.getBytes(Charset.forName("UTF-8")));
此处,您将 createMime()
的 mimeType
参数和 mimeData
参数都设置为字符串 zawartosc
.
您实际上想做的是创建一个纯文本记录。这可以是 NFC 论坛文本记录或 MIME 类型设置为 "text/plain" 的 MIME 类型记录。 NFC 论坛文本记录也是 NXP TagWriter 在选择 "Plain text" 选项时创建的记录类型。
在 Android 中,您可以使用 createTextRecord()
辅助方法创建文本记录:
NdefRecord record = NdefRecord.createTextRecord("en", zawartosc);
这适用于 API 21 级以上。请参阅 [方法 NdefRecord.createTextRecord(“en” , “string”) 在 API 级别 21 以下不起作用
() 实现 createTextRecord()
适用于早期 Android 版本。
如果您更喜欢使用 MIME 类型的记录,您还可以使用:
NdefRecord record = NdefRecord.createMime("text/plain", zawartosc.getBytes(Charset.forName("US-ASCII")));
这将创建类型为 "text/plain" 的 MIME 类型记录,其中包含字符串 zawartosc
的 ASCII 编码值。请注意,text/plain 被定义为包含 ASCII 编码的纯文本数据。如果要使用 UTF-8 编码,通常会在类型名称中指定显式编码:
NdefRecord record = NdefRecord.createMime("text/plain; encoding=utf-8", zawartosc.getBytes(Charset.forName("UTF-8")));
最后,我想知道您是否真的想在文本记录中传输结构化数据(例如 JSON 或类似数据)。文本记录表示人类可读的纯文本。传输特定于应用程序的结构化数据的更好方法是 NFC 论坛外部类型或自定义 MIME 类型记录。
我根据示例制作了一个应用程序,用于在 Android 上编写 NFC 代码。我的标签是 NXP NTAG216。
但我有一个问题:用我的应用程序编写标签后,NXP 的 TagWriter 应用程序将数据显示为 "unknown content",如下所示:
但是,当我使用 NXP TagWriter 将值写入 "Plain Text" 时,我得到:
这是我的 onNewIntent 代码:
@Override
protected void onNewIntent(Intent intent) {
// Tag writing mode
String zawartosc = "Data from field";
if (mWriteMode && NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
NdefRecord record = NdefRecord.createMime(zawartosc, zawartosc.getBytes(Charset.forName("UTF-8")));
NdefMessage message = new NdefMessage(new NdefRecord[]{record});
if (writeTag(message, detectedTag)) {
Toast.makeText(this, "Success", Toast.LENGTH_LONG)
.show();
}
}
}
写标签:
public boolean writeTag(NdefMessage message, Tag tag) {
int size = message.toByteArray().length;
try {
Ndef ndef = Ndef.get(tag);
if (ndef != null) {
ndef.connect();
if (!ndef.isWritable()) {
Toast.makeText(getApplicationContext(),
"Unwritable",
Toast.LENGTH_SHORT).show();
return false;
}
if (ndef.getMaxSize() < size) {
Toast.makeText(getApplicationContext(),
"Text is too short",
Toast.LENGTH_SHORT).show();
return false;
}
ndef.writeNdefMessage(message);
return true;
} else {
NdefFormatable format = NdefFormatable.get(tag);
if (format != null) {
try {
format.connect();
format.format(message);
return true;
} catch (IOException e) {
return false;
}
} else {
return false;
}
}
} catch (Exception e) {
return false;
}
}
有没有办法以某种方式将内容类型更改为 NXP TagWriter 写入的内容类型?当它是未知类型时,我在稍后正确阅读代码时遇到问题。
你得到的正是你写入标签的内容,一个 MIME 类型的记录,其值设置为 UTF-8 编码的字符串“{number_id:"test12"}”和 MIME type 设置为完全相同(且无效!)的值。您在创建 MIME 类型记录期间执行了此操作:
NdefRecord record = NdefRecord.createMime(zawartosc, zawartosc.getBytes(Charset.forName("UTF-8")));
此处,您将 createMime()
的 mimeType
参数和 mimeData
参数都设置为字符串 zawartosc
.
您实际上想做的是创建一个纯文本记录。这可以是 NFC 论坛文本记录或 MIME 类型设置为 "text/plain" 的 MIME 类型记录。 NFC 论坛文本记录也是 NXP TagWriter 在选择 "Plain text" 选项时创建的记录类型。
在 Android 中,您可以使用 createTextRecord()
辅助方法创建文本记录:
NdefRecord record = NdefRecord.createTextRecord("en", zawartosc);
这适用于 API 21 级以上。请参阅 [方法 NdefRecord.createTextRecord(“en” , “string”) 在 API 级别 21 以下不起作用
(createTextRecord()
适用于早期 Android 版本。
如果您更喜欢使用 MIME 类型的记录,您还可以使用:
NdefRecord record = NdefRecord.createMime("text/plain", zawartosc.getBytes(Charset.forName("US-ASCII")));
这将创建类型为 "text/plain" 的 MIME 类型记录,其中包含字符串 zawartosc
的 ASCII 编码值。请注意,text/plain 被定义为包含 ASCII 编码的纯文本数据。如果要使用 UTF-8 编码,通常会在类型名称中指定显式编码:
NdefRecord record = NdefRecord.createMime("text/plain; encoding=utf-8", zawartosc.getBytes(Charset.forName("UTF-8")));
最后,我想知道您是否真的想在文本记录中传输结构化数据(例如 JSON 或类似数据)。文本记录表示人类可读的纯文本。传输特定于应用程序的结构化数据的更好方法是 NFC 论坛外部类型或自定义 MIME 类型记录。