2016-06-17 2 views
1

Этот код прекрасно работает, когда я использую его на устройстве с Android Lollipop (5.x) или Зефир (6.0):Метод NdefRecord.createTextRecord («ан», «строка») не работает ниже уровня API 21

@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
public NdefMessage createNdfMessage(String content) { 
    NdefRecord record = NdefRecord.createTextRecord("en", content); 
    NdefMessage msg = new NdefMessage(new NdefRecord[]{record}); 
    return msg; 
} 

Но когда я пробую это на устройстве с Android 4.2.2 (API-уровень 17), мое приложение падает. Как я могу использовать этот код для создания текстовой записи на уровнях API ниже 21 (это уровень API, где стал доступен метод NdefRecord.createTextRecord)?

ответ

3

Метод NdefRecord.createTextRecord() был введен в уровне API 21. Следовательно, он не доступен на платформах ниже этого уровня API. Однако вы можете легко собрать текстовую запись самостоятельно. Полезная нагрузка текстового записи состоит из байта состояния, поле кода языка, и текстовое поле:

 
+-------------+---------------+--------------------------+ 
| Status byte | Language code | Text      | 
| (1 byte) | (n byte)  | (m byte)     | 
+-------------+---------------+--------------------------+ 
  • байт состояния указывает кодировку текстового поля (0 = UTF-8, 1 = UTF-16) в бит 7 и длину n кода языка в битах 5..0. Бит 6 всегда должен быть равен нулю.
  • Код языка содержит код языка IANA, закодированный в US-ASCII (например, «en»).

Вы можете создать текстовую запись с помощью этого метода:

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(e); 
    } 

    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", content); 
+1

спасибо за помощь, теперь он отлично работает –

0

Да, createTextRecord представлен в API 21, поэтому вы не можете назвать его в предыдущих версиях. https://developer.android.com/reference/android/nfc/NdefRecord.html

Проверьте, соответствует ли ваш уровень API 21 для вызова createTextRecord.

public NdfeMessage create(String content){ 
    int currentapiVersion = android.os.Build.VERSION.SDK_INT; 
    if (currentapiVersion >= android.os.Build.VERSION_CODES.LOLLIPOP){ 
     NdefRecord record = NdefRecord.createTextRecord("en", content); 
     NdefMessage msg = new NdefMessage(new NdefRecord[]{record}); 
     return msg; 
    } else{ 
     return null; 
    } 
} 
+0

, но я также хочу написать простой/текст из устройств ниже уровня апи 21 –

+0

Вы можете написать сообщение от уровня API 10, но вы не могу написать новую запись под уровнем 21, это не то же самое. https://developer.android.com/reference/android/nfc/tech/Ndef.html#writeNdefMessage(android.nfc.NdefMessage) –

+1

API ниже 21 не означает, что вы не можете записать запись, но это означает ' NdefRecord.createTextRecord' недоступен. Вы все равно можете создать его другим способом, как утверждает другой ответ. –

Смежные вопросы