Android写NFC代码导致 "unknown content"类型

标签 android tags nfc mime-types ndef

我根据示例制作了一个应用程序,用于在 Android 上编写 NFC 代码。我的标签是 NXP NTAG216。

但我有一个问题:用我的应用程序编写标签后,NXP 的 TagWriter 应用程序将数据显示为“未知内容”,如下所示:

但是,当我使用 NXP TagWriter 将值写入“纯文本”时,我得到:

这是我的 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 类型设置为完全相同(并且无效值。您在创建 MIME 类型记录期间执行了此操作:

NdefRecord record = NdefRecord.createMime(zawartosc, zawartosc.getBytes(Charset.forName("UTF-8")));

在这里,您将 createMime()mimeType 参数和 mimeData 参数都设置为字符串 zawartosc.

您真正想要做的是创建一个纯文本记录。这可以是 NFC 论坛文本记录,也可以是 MIME 类型设置为“text/plain”的 MIME 类型记录。 NFC 论坛文本记录也是 NXP TagWriter 在选择“纯文本”选项时创建的记录类型。

在 Android 中,您可以使用 createTextRecord() 辅助方法创建文本记录:

NdefRecord record = NdefRecord.createTextRecord("en", zawartosc);

这适用于 API 级别 21+。请参阅 [Method NdefRecord.createTextRecord(“en” , “string”) 在 API 级别 21 以下不工作 ( Method NdefRecord.createTextRecord("en" , "string") not working below API level 21 ) 实现适用于早期 Android 版本的 createTextRecord()

如果您更喜欢使用 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代码导致 "unknown content"类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43607313/

相关文章:

android - 如何通过 API 启用 NFC 阅读器?

java - NFC标签上的图片

android COSU 单一应用程序 - 锁定浏览器和小工具上的一个网络应用程序

html - 对于非 www 到 www,我应该在我的主页上使用 rel ="canonical"吗?

json - 用于添加多个标签名称和标签值的 Azure Policy

c - 在 C 项目中包含 json-c

单选中的android图像

android - 如何在 android 中创建日历的完整功能?

c# - MvvmCross-MvxBind :Warning Failed to create target binding for binding Hello for -empty-

ios - 使用标签处理时 UIButton 图像未正确设置