设置和获取 NdefRecord ID
Setting and getting NdefRecord ID
我正在尝试在 Android 上写入和读回一些 NdefRecords,但在检索记录 ID 时遇到问题。我相信这是因为它们最初没有被写入标签。
我正在这样创建我的记录:
private NdefRecord createRecord(String text, byte ID) throws UnsupportedEncodingException {
String lang = "en";
byte[] textBytes = text.getBytes();
byte[] langBytes = lang.getBytes("US-ASCII");
int langLength = langBytes.length;
int textLength = textBytes.length;
byte[] id = new byte[1];
id[0] = ID;
int idLength = id.length;
byte[] payload = new byte[1 + langLength + textLength + idLength];
payload[0] = (byte) langLength;
//set use id flag
payload[0] |= (1 << 3);
// copy langbytes and textbytes into payload
System.arraycopy(langBytes, 0, payload, 1, langLength);
System.arraycopy(textBytes, 0, payload, 1 + langLength, textLength);
// System.arraycopy(id, 0, payload, 1 + langLength + textLength, idLength);
NdefRecord recordNFC = new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, id, payload);
return recordNFC;
}
public void addRecord(String record_contents, RECORD_IDS record_id) throws UnsupportedEncodingException {
this.records.add(createRecord(record_contents, (byte) record_id.getValue()));
}
我以为我对
有所了解
// System.arraycopy(id, 0, payload, 1 + langLength + textLength, idLength);
但这对我没有用。此方法将 NdefRecords 存储在 class 对象中,然后使用
发送
public void writeStoredRecords(Tag tag) throws IOException, FormatException {
NdefRecord[] final_records = (NdefRecord[]) this.records.toArray(new NdefRecord[0]);
NdefMessage message = new NdefMessage(final_records);
try {
Ndef ndef = Ndef.get(tag);
if (ndef != null) {
ndef.connect();
if(!ndef.isWritable())
return;
ndef.writeNdefMessage(message);
ndef.close();
}
}catch(Exception e){}
}
记录对象在调用 new NdefRecord
后填充了它们的 ID,但是当使用应用 NXP TagInfo 读取标签时,NDEF 记录 ID 显示为“”。
有人有这方面的经验吗?由于记录 ID 很少与 NFC 一起使用,因此在线资源稀缺。
根据NFC论坛NDEF规范,NDEF记录的ID字段必须是URI。因此,NXP TagInfo 会将此值视为 URI 字符串并将字节数组解码为字符串(虽然我不太确定他们期望使用哪种编码,但浏览 NDEF 规范时,我希望使用 US-ASCII 编码)。
由于您使用单个字节作为 ID 字段,该值可能无法解码为可打印字符。因此,NXP TagInfo 仅打印“”(不可打印字符串值两边的引号)。
我正在尝试在 Android 上写入和读回一些 NdefRecords,但在检索记录 ID 时遇到问题。我相信这是因为它们最初没有被写入标签。
我正在这样创建我的记录:
private NdefRecord createRecord(String text, byte ID) throws UnsupportedEncodingException {
String lang = "en";
byte[] textBytes = text.getBytes();
byte[] langBytes = lang.getBytes("US-ASCII");
int langLength = langBytes.length;
int textLength = textBytes.length;
byte[] id = new byte[1];
id[0] = ID;
int idLength = id.length;
byte[] payload = new byte[1 + langLength + textLength + idLength];
payload[0] = (byte) langLength;
//set use id flag
payload[0] |= (1 << 3);
// copy langbytes and textbytes into payload
System.arraycopy(langBytes, 0, payload, 1, langLength);
System.arraycopy(textBytes, 0, payload, 1 + langLength, textLength);
// System.arraycopy(id, 0, payload, 1 + langLength + textLength, idLength);
NdefRecord recordNFC = new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, id, payload);
return recordNFC;
}
public void addRecord(String record_contents, RECORD_IDS record_id) throws UnsupportedEncodingException {
this.records.add(createRecord(record_contents, (byte) record_id.getValue()));
}
我以为我对
有所了解// System.arraycopy(id, 0, payload, 1 + langLength + textLength, idLength);
但这对我没有用。此方法将 NdefRecords 存储在 class 对象中,然后使用
发送public void writeStoredRecords(Tag tag) throws IOException, FormatException {
NdefRecord[] final_records = (NdefRecord[]) this.records.toArray(new NdefRecord[0]);
NdefMessage message = new NdefMessage(final_records);
try {
Ndef ndef = Ndef.get(tag);
if (ndef != null) {
ndef.connect();
if(!ndef.isWritable())
return;
ndef.writeNdefMessage(message);
ndef.close();
}
}catch(Exception e){}
}
记录对象在调用 new NdefRecord
后填充了它们的 ID,但是当使用应用 NXP TagInfo 读取标签时,NDEF 记录 ID 显示为“”。
有人有这方面的经验吗?由于记录 ID 很少与 NFC 一起使用,因此在线资源稀缺。
根据NFC论坛NDEF规范,NDEF记录的ID字段必须是URI。因此,NXP TagInfo 会将此值视为 URI 字符串并将字节数组解码为字符串(虽然我不太确定他们期望使用哪种编码,但浏览 NDEF 规范时,我希望使用 US-ASCII 编码)。
由于您使用单个字节作为 ID 字段,该值可能无法解码为可打印字符。因此,NXP TagInfo 仅打印“”(不可打印字符串值两边的引号)。