我尝试通过NFC
发送特定字符串。此应用的关键是TAG应将字符串作为hex
值接收,而不是ASCII
。所以,这就是问题所在。 NdefMessage()
将字符串格式化为十六进制,即使它已经是十六进制。
这是代码:
byte[] lang = new byte[0];
try {
lang = Locale.getDefault().getLanguage().getBytes("UTF-8");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
byte[] text = new byte[0]; // Content in UTF-8
try {
text = sendDdata.getBytes("UTF-8");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
int langSize = lang.length;
int textLength = text.length;
ByteArrayOutputStream payload = new ByteArrayOutputStream(1 + langSize + textLength);
payload.write((byte) (langSize & 0x1F));
payload.write(lang, 0, langSize);
payload.write(text,0,textLength);
byte[] message1 = payload.toByteArray();
NdefMessage record = null;
record = new NdefMessage(new NdefRecord(NdefRecord.TNF_WELL_KNOWN, new byte[0], new byte[0], message1));
if (tag != null) {
try {
Ndef ndefTag = Ndef.get(tag);
if (ndefTag == null) {
NdefFormatable nForm = NdefFormatable.get(tag);
if (nForm != null) {
nForm.connect();
nForm.format(record);
nForm.close();
Toast.makeText(MainActivity.this,"format",Toast.LENGTH_SHORT).show();
}
}
else {
ndefTag.connect();
ndefTag.writeNdefMessage(record);
ndefTag.close();
Toast.makeText(MainActivity.this,String.valueOf(record),Toast.LENGTH_SHORT).show();
}
}
catch(Exception e) {
e.printStackTrace();
Toast.makeText(this,"Please attach to Tag!",Toast.LENGTH_SHORT).show();
}
并使用调试器返回如下内容: 应该发送的字符串:
" 41542b5733322c340DFD020300"
有效载荷:
" en41542b5733322c340DFD020300"
消息发送:
NdefMessage [NdefRecord tnf=1 payload=02656E3431353432623537333333323263333430444644303230333030]
有没有办法像十六进制一样发送,而不再将其转换为十六进制?
第二个问题:是否可以在没有标题的情况下发送Ndef消息?只有有效载荷?
提前谢谢。
答案 0 :(得分:1)
您正在使用tnf" TNF_EXTERNAL_TYPE"创建记录。 (NdefRecord definition)。此tnf是为文本,URI或SmartPoster的RTD定义的。二进制值不应该去那里。
如果要存储二进制值,请考虑使用带有tnf" TNF_UNKNOWN"的记录。在那里,您可以自由地以您想要的任何格式存储数据。
但是,在这种情况下,读取标记的应用程序必须相应地解释数据。如果是您的应用程序,您可以轻松地做到这一点。如果阅读应用程序是其他内容,您可能必须符合应用程序理解的定义。