【问题标题】:Missing data when reading URI from NFC tag从 NFC 标签读取 URI 时缺少数据
【发布时间】:2017-10-09 14:08:34
【问题描述】:

我在我的应用程序代码中创建了一个 NFC 读/写部分,其中:

READ 负责处理数据并触发网络浏览器:

ndef.connect()
val ndefMessage = ndef.ndefMessage
if (ndefMessage.records != null && ndefMessage.records.isNotEmpty()) {
   message = String(it.records[0].payload)
}
ndef.close()

WRITE 将 URL 写入 NFC 标签:

ndef.connect()
val mimeRecord = NdefRecord.createUri(url)
ndef.writeNdefMessage(NdefMessage(mimeRecord))
ndef.close()

由于某种神秘原因,当我编写 URL“http://www.google.com”时,我的 message 变量(在读取带有该 URL 的标签后)仅包含“google.com”。我不知道为什么 URL 的其余部分(“http://www.”)被删除/省略。你能告诉我发生了什么事吗?我的错在哪里?

【问题讨论】:

  • 澄清一下,您正在将变量url 写入标签,其值为http://www.google.com,而当您读取它时,返回的只是google.com?你试过其他网址吗?查看 url 的创建位置可能会有所帮助。
  • 是的,目前它的工作原理与您所写的完全一样。是的,我确实尝试了不同的 URL - 没有区别:C 我从 EditText 小部件中读取 URL 并将其传递给我的 TagManager
  • 我不能把这个作为答案,因为它更像是一个理论,但 NFC 信息必须简短而简洁。 Ndef 库很有可能故意缩短 URL,如果它以 http://www 开头,因为那是一种“默认”URI。
  • 网址不是http://www.google.com!如果可以的话... createUri 确实可以规范您的字符串,但它不会删除http://www. 这发生在其他地方。见:developer.android.com/reference/android/nfc/…
  • “是的,目前它的工作原理与您所写的完全一样。”好的,我退出了这个讨论。如果你甚至不明白你回答的人是不可能帮助你的。无论如何,你也不明白我评论的重点。祝你的问题好运! - 此答案与已删除的评论有关 -

标签: android tags uri nfc ndef


【解决方案1】:

您正在尝试将 NDEF 记录的负载解码为简单文本(UTF-8 编码字符串):

message = String(it.records[0].payload)

但是,您将 URL 编写为 NFC 论坛 URI 记录:

NdefRecord.createUri(url)

因此,您需要根据 NFC 论坛 URI 记录类型定义规范(可从 NFC 论坛获得)解释 URI 记录。此类 URI 记录的有效负载由一个缩写字节(您可以使用它在明确定义的前缀表中查找 URI 前缀)和 URI 后缀(UTF-8 编码)组成。

您可以自行解析记录有效负载,也可以使用类似以下的方法让 Android 为您施展魔法:

uriString = it.records[0].toUri()

【讨论】:

    猜你喜欢
    • 2013-05-24
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多