2016-06-17 7 views
1

나는 안드로이드 롤리팝 (5.x를) 또는 산들 바람을 가진 장치 (6.0)에서 사용할 때이 코드는 잘 작동 :방법 NdefRecord.createTextRecord ("EN", "문자열") 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) 기기에서이 앱을 사용하면 앱이 다운됩니다. 이 코드를 사용하여 메소드가 NdefRecord.createTextRecord이 된 API 레벨 인 21 세 미만의 API 레벨에서 텍스트 레코드를 만들려면 어떻게해야합니까?

답변

3

있어서 NdefRecord.createTextRecord()이 결과, 그 API 레벨 이하 플랫폼 API를 사용할 수없는 수준 (21)에 도입 하였다. 그러나 독자적으로 텍스트 레코드를 쉽게 조합 할 수 있습니다.

 
+-------------+---------------+--------------------------+ 
| Status byte | Language code | Text      | 
| (1 byte) | (n byte)  | (m byte)     | 
+-------------+---------------+--------------------------+ 
  • 상태 바이트가 텍스트 필드의 문자 인코딩 (0 = UTF-8, 1을 나타냅니다 텍스트 레코드의 페이로드는 상태 바이트 언어 코드 필드 및 텍스트 필드로 구성 = UTF-16) 및 비트 코드 5.00의 언어 코드의 길이 n. 비트 6은 항상 0이어야합니다.
  • 언어 코드 입력란에 US-ASCII로 인코딩 된 IANA 언어 코드 (예 : '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

createTextRecord를 호출하기 전에 API 레벨이 21인지 확인하십시오.

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

을하지만, 나 또한 당신은 API 레벨 10에서 메시지를 쓸 수있는 21 –

+0

API 레벨 아래 장치에서 일반/텍스트를 작성하고 싶지만 레벨 21 아래에 새 레코드를 쓸 수 없습니다. 동일하지 않습니다. https://developer.android.com/reference/android/nfc/tech/Ndef.html#writeNdefMessage(android.nfc.NdefMessage) –

+1

21 이하의 API는 레코드를 작성할 수 없다는 것을 의미하지는 않지만, NdefRecord.createTextRecord'을 사용할 수 없습니다. 다른 답변 상태와 달리 다른 방식으로 만들 수 있습니다. –