2016-02-13 2 views
0

У меня есть метод, который записывает данные в обнаруженный тег NFC (данные поступают из массива записей toWriteRecordsList).Ошибка NdefRecord.createMime в аргументах

// ... 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 указать то закодированное сообщение, когда отображается в приложении Tag Android по умолчанию («Тег коллектора»), является то, что первый аргумент (в данном случае сообщение телефон печатает это «текст/обычный»)

Когда createMime() определенно есть эта подпись:

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

Потому что это казалось настолько биз arre для меня, я поменял аргументы (включая вызов .getBytes(), чтобы удовлетворить прототип), и это сработало! Я пробовал это на двух разных устройствах (Galaxy Nexus и Galaxy S4) и получил такое же поведение.

Я не могу найти запись об ошибке Android, поэтому я решил, что делаю что-то неправильно. Что, черт возьми, происходит?

+0

Метод работал по назначению на всех проверенных мной устройствах. Как вы читаете данные из тега? –

+0

@MichaelRoland: «Tag detectedTag = intent.getParcelableExtra (NfcAdapter.EXTRA_TAG);' – henrycjc

+0

Это не читает никаких тегов * данных *. –

ответ

1

Нет ничего плохого в методе NdefRecord.createMime(...). В Android-приложении «Tag» отображаются записи типа MIME, указывая имя типа MIME, а не его полезную нагрузку. Следовательно, приложение правильно показывает первый аргумент метода createMime() (т. Е. Имя типа).

Для отображения полезной нагрузки записи типа MIME приложение Tag должно декодировать полезную нагрузку на основе имени типа, которое это приложение просто не делает. См. Исходный код метода getView() для записей MIME в приложении тега: MimeRecord.java:59.

Обратите внимание, что если вы хотите, чтобы приложение тегов для отображения текста, хранящийся в записи ЦНК, вы должны использовать NFC Forum типа Text записи:

NdefRecord r = NdefRecord.createTextRecord("en", recordArr[1]); 

Или для Android до того уровня API 21:

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]); 
+0

Спасибо за разъяснение. К сожалению, метод createTextRecord недоступен мне (как API 21). Есть ли другой способ? – henrycjc

+0

@Henry См. Обновленный ответ. –

+1

Спасибо. Примечание для API <19 вы должны использовать 'Charset.forName()', а не 'StandardCharsets'. Теперь все работает. – henrycjc