2012-07-24 1 views
0

원본 질문을 FormatException 중 하나 인 변환 중 하나로 오해했습니다. EditText 입력을 기반으로 NFC 태그를 쓰려고합니다. 아래 관련 코드 :NdefMessage를 생성 할 때 FormatException이 발생했습니다.

EditText msgInput = (EditText) findViewById(R.id.editText1); 

... 

try { 
    String msg = msgInput.getText().toString(); 
    byte[] bytes = msg.getBytes(); 
    messagePayload = bytes; 
} 

... 

NdefMessage message; 
try { 
message = new NdefMessage(messagePayload); 
} catch (FormatException e) { 
// ups, illegal ndef message payload 
Log.e(TAG, "Format exception from illegal ndef message payload"); 

return; 
} 

그리고 항상 그 FormatException을 던지고 있습니다. 이유가 확실하지 않습니다. 나는 'xyz'또는 'stuff'또는 이와 비슷한 것을 쓰려고합니다. 내가 각 사이에 로그 문에서 오른쪽 바이트를 받고있어 보장합니다.

+0

NFC 태그는 NDEF 형식입니까? – CommonsWare

+0

예, 그렇습니다. 죄송합니다, 위의 게시물에서 명확하게해야합니다. 나는 다른 애플 리케이션에도 아무런 문제가 없다. – alextoombs

+0

'NdefRecord' 객체를 사용하는'NdefMessage' 생성자를 사용하고 그 생성자와 함께 사용할 적절한'NdefRecord' 객체를 만드는 것이 좋습니다. 지금 당장 당신은 NDEF 태그에 무작위로 넣을 수 있다고 가정하고 있습니다. 정확하지 않다고 생각합니다. – CommonsWare

답변

1

문자열의 바이트 만 제공하는 것은 유효한 NdefMessage 페이로드가 아닙니다. 그래서 예외가 생기는 이유입니다. NFC 포럼 표준 사용에이 코드에 따라 서식이 하나 개의 텍스트 레코드와 올바른 NdefMessage를 구성하려면 : 자세한 내용은 https://engineering.purdue.edu/477grp14/Specs/NFC/NDEFTECH.pdf

다음 NDEF 프로토콜에 대한 자세한 세부 내용은

  String msg = msgInput.getText().toString(); 
    byte[] languageCode; 
    byte[] msgBytes; 
    try { 
     languageCode = "en".getBytes("US-ASCII"); 
     msgBytes = msg.getBytes("UTF-8"); 
    } catch (UnsupportedEncodingException e) { 
     return; 
    } 

    byte[] messagePayload = new byte[1 + languageCode.length 
      + msgBytes.length]; 
    messagePayload[0] = (byte) 0x02; // status byte: UTF-8 encoding and 
             // length of language code is 2 
    System.arraycopy(languageCode, 0, messagePayload, 1, 
      languageCode.length); 
    System.arraycopy(msgBytes, 0, messagePayload, 1 + languageCode.length, 
      msgBytes.length); 

    NdefMessage message; 
    NdefRecord[] records = new NdefRecord[1]; 
    NdefRecord textRecord = new NdefRecord(NdefRecord.TNF_WELL_KNOWN, 
      NdefRecord.RTD_TEXT, new byte[]{}, messagePayload); 
    records[0] = textRecord; 
    message = new NdefMessage(records); 

을이 문서를 참조하십시오 본문 RTD에서이 부분을보십시오 : http://www.maintag.fr/fichiers/pdf-fr/nfcforum-ts-rtd-text-1-0.pdf

관련 문제