我有一种将数据写入发现的NFC标签的方法(数据来自记录toWriteRecordsList
的数组)。
// ... more up here ...
for (String record : toWriteRecordsList) {
String[] recordArr = record.split(":");
// I verified the recordArr contained the correct data
try {
// This line writes 'text/plain' as the message/payload
//records[currentRecord] = NdefRecord.createMime("text/plain", recordArr[1].getBytes("US-ASCII"));
// This line works as intended...¯\_(ツ)_/¯
records[currentRecord] = NdefRecord.createMime(recordArr[1], "text/plain".getBytes());
} catch (Exception e ) {
e.printStackTrace();
}
currentRecord++;
}
// ... actual writing down here ...
奇怪的是,当我使用
NdefRecord.createMime
方法作为docs指定时,那么当编码的消息显示在Android默认标签应用(“标签收集器”)中时,它就是第一个参数(在这种情况下为电话消息)打印为“文本/纯文本!”)当
createMime()
绝对具有此签名时:public static NdefRecord createMime (String mimeType, byte[] mimeData)
因为这对我来说似乎很奇怪,所以我交换了参数(包括调用
.getBytes()
来满足原型),它奏效了!我在两种不同的设备(Galaxy Nexus和Galaxy S4)上进行了尝试,并获得了相同的行为。我找不到任何关于Android错误的记录,所以我觉得自己做错了什么。这到底是怎么回事?
最佳答案
NdefRecord.createMime(...)
方法没有任何问题。 Android默认的“标签”应用通过显示MIME类型的名称而不是其有效负载来显示MIME类型记录。因此,该应用正确显示了createMime()
方法的第一个参数(即类型名称)。
要显示MIME类型记录的有效负载,Tag应用程序需要根据类型名称对记录有效负载进行解码,而该应用程序根本不会这样做。请参见getView()
方法的源代码以获取Tag应用程序中的MIME记录:MimeRecord.java:59。
请注意,如果您希望标签应用程序显示存储在NDEF记录中的文本,则可以使用NFC论坛文本记录类型:
NdefRecord r = NdefRecord.createTextRecord("en", recordArr[1]);
或对于API级别21之前的Android:
public static NdefRecord createTextRecord(String language, String text) {
byte[] languageBytes;
byte[] textBytes;
try {
languageBytes = language.getBytes("US-ASCII");
textBytes = text.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
throw new AssertionError(ex);
}
byte[] recordPayload = new byte[1 + (languageBytes.length & 0x03F) + textBytes.length];
recordPayload[0] = (byte)(languageBytes.length & 0x03F);
System.arraycopy(languageBytes, 0, recordPayload, 1, languageBytes.length & 0x03F);
System.arraycopy(textBytes, 0, recordPayload, 1 + (languageBytes.length & 0x03F), textBytes.length);
return new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, null, recordPayload);
}
NdefRecord r = createTextRecord("en", recordArr[1]);