参数中的NdefRecord.createMime错误

时间:2016-02-13 04:18:44

标签: java android nfc mime-types ndef

我有一种方法可以将数据写入已发现的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默认标记应用("标记收集器")中显示时,是第一个参数是(在这种情况下,电话打印的消息是" text / plain"!)

createMime()肯定有此签名时:

public static NdefRecord createMime (String mimeType, byte[] mimeData)

因为这对我来说似乎很奇怪,我交换了参数(包括调用.getBytes()以满足原型)并且它有效!我在两个不同的设备(Galaxy Nexus和Galaxy S4)上试过这个并且得到了相同的行为。

我无法找到Android错误的任何记录,因此我认为我做错了什么。到底是怎么回事?

1 个答案:

答案 0 :(得分:1)

NdefRecord.createMime(...)方法没有任何问题。 Android默认“Tag”应用程序通过显示MIME类型的名称而不是其有效负载来显示MIME类型记录。因此,应用程序正确显示createMime()方法的第一个参数(即类型名称)。

显示MIME类型记录的有效负载需要Tag应用程序根据类型名称解码记录有效负载,此应用程序根本不会这样做。请参阅标记应用中的getView() MIME记录方法的源代码:MimeRecord.java:59

请注意,如果您希望Tag应用程序显示存储在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]);