gpt4 book ai didi

安卓 NFC : Smart Poster NDEF Record with concatenated "URI" and "Text" Contents

转载 作者:行者123 更新时间:2023-11-29 21:12:34 25 4
gpt4 key购买 nike

我开发了一个多用途 NFC 应用程序,它能够以不同类型的格式读取和写入不同类型的标签,包括外部类型、RTD 文本和 RTD URI。但是,解析和读取“TNF_WELL_KNOWN”智能海报内容时存在问题。更具体地说,从我遇到的问题开始,我在 Android 上使用著名的“NFC TagWriter”应用程序来创建一个简单的联系人内容。此联系人包含姓名(例如“警察”)和电话号码(例如“911”)。当尝试使用另一个名为“NFC TagInfo”的流行应用程序读取相同内容时,我能够成功读取智能海报,准确显示它应该显示的内容:

众所周知:urn:nfc:wkt:Sp(智能海报)

  1. 众所周知:urn:nfc:wkt:U (URI)标识符:0x05(“电话:”)“911”
  2. 众所周知:urn:nfc:wkt:U(文本)编码:UTF-8语言:zh“警察”

另一方面,我无法实现相同的目标。这是我想出的代码,试图解码上述内容:

首先,我提取 NDEF 消息及其对应的 NDEF 记录:

 // Use NdefMessage[] getNdefMessages(Intent) method to extract NDEF Message(s)

NdefMessage[] ndefMessages = getNdefMessages(intent);
for(int i = 0; i < ndefMessages.length; i++) {

ndefRecords = ndefMessages[i].getRecords();

for (int j = 0; j < ndefRecords.length; j++) {

// NDEF Record parsing snippet comes here!
if (ndefRecords[j].getTnf() == NdefRecord.TNF_WELL_KNOWN) {

// If TNF indicates a "Well-known" type,
// determine the type using "Type" field

if (Arrays.equals(ndefRecords[j].getType(), NdefRecord.RTD_SMART_POSTER)) {

// First try to decode the content
payload = new String(ndefRecords[j].getPayload(), 1, ndefRecords[j].getPayload().length - 1, Charset.forName("UTF-8"));
Log.i(TAG, "Content: " + payload);

// Second try to decode the content
Log.i(TAG, "Content: " + ndefRecords[j].toUri());
}
}
}
}

当查看 Logcat 输出时,第一个 Log.i 打印:

U911Q   TenPolice

第二次打印时:

tel:911

在我看来,NFC TagWriter 应用程序创建了一个嵌套的 NDEF 记录,其中连接了一种 URI 类型和一种文本类型。我想弄清楚如何成功解码此内容。第一次尝试删除有效负载 header 并解码 NDEF 记录有效负载的剩余部分。显然,第一部分包含“tel:911”内容,第二部分包含“Police”,其中“en”表示语言。第二次尝试使用 NDEFRecord 类的 toUri() 辅助方法,根据 API 文档,该方法能够提取 RTD URI。我想知道为了提取所有嵌套记录,我们可以解码一个,将其转换为 byte[] 数组并从有效负载中删除,这将被重新迭代以进行另一次解码。虽然,这种方法看起来效率很低。因此,我想知道其他专家对如何解决这个问题有何建议。

[更新] 以下是为感兴趣的人编写智能海报 NDEF 记录的简短 fragment :

NdefRecord uriNdefRecord = NdefRecord.createUri(Uri.parse((String) o[0])); //RTD_URI
NdefRecord textNdefRecord = createTextRecord((String) o[1], Locale.US, true); //RTD_TEXT
NdefRecord[] recs = new NdefRecord[]{uriNdefRecord, textNdefRecord};
NdefMessage smartPosterpContentMessage = new NdefMessage(recs);
byte[] bytes = smartPosterpContentMessage.toByteArray();
NdefRecord newRec = new NdefRecord((short) 0x01, NdefRecord.RTD_SMART_POSTER, null, bytes);
ndefMessageWriter(new NdefMessage(newRec));

在上面的代码 fragment 中,“ndefMessageWriter”使用线程与标签通信并将内容写入标签。

最佳答案

如您所见,智能海报记录包含一个文本记录和一个 URI 记录作为其有效负载。因此,要获得这些记录,您要做的就是解码智能海报记录有效负载(顺便说一句。如果您用 Google 搜索“智能海报记录”,您很快就会想出智能海报记录类型定义规范,捕获它 here ) .

您已经发现 SP 记录包含 NDEF 消息,因此您可以将记录的有效负载解码为 NDEF 消息:

NdefMessage spContentMsg = new NdefMessage(spRecord.getPayload());

现在您有一个 NDEF 消息,根据规范,它至少包含一个 URI 记录和一些其他可选记录(例如,每种语言的一个描述性文本记录):

NdefRecord[] spContentRecs = spContentMsg.getRecords();
for (NdefRecord rec : spContentRecs) {
if (rec.getTnf() == NdefRecord.TNF_WELL_KNOWN) {
if (Arrays.equals(rec.getType(), NdefRecord.RTD_URI)) {
// do something
} else if (Arrays.equals(rec.getType(), NdefRecord.RTD_TEXT)) {
// do something
}
}
}
}

顺便说一句,大多数 NFC Forum 的规范都写得很好并且易于遵循(特别是各种 NDEF 和 RTD 相关规范)。

关于安卓 NFC : Smart Poster NDEF Record with concatenated "URI" and "Text" Contents,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22357664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com