2017-10-03 2 views
2

저는 Android NFC 프로그래밍에 상당히 익숙하며 NXP MIFARE Ultralight NTAG216 태그를 구입했습니다. 여기에는 바이트가 포함됩니다. 내 응용 프로그램에서 나는 내가 태그에 원하는 것을 저장하기 위해 약 600 문자를 필요로하는 다음태그 크기/인코딩 동작

public void write(String text, Tag tag) throws IOException, FormatException { 
    NdefRecord[] records = { createRecord(text) }; 
    NdefMessage message = new NdefMessage(records); 
    Ndef ndef = Ndef.get(tag); 
    ndef.connect(); 
    ndef.writeNdefMessage(message); 
    ndef.close(); 
} 

private NdefRecord createRecord(String content) throws UnsupportedEncodingException { 
    String lang = "en"; 
    byte[] textBytes = content.getBytes(); 
    byte[] langBytes = lang.getBytes("US-ASCII"); 
    int langLength = langBytes.length; 
    int textLength = textBytes.length; 

    byte[] payload = new byte[1 + langLength + textLength]; 
    payload[0] = (byte) langLength; 

    System.arraycopy(langBytes, 0, payload, 1, langLength); 
    System.arraycopy(textBytes, 0, payload, 1 + langLength, textLength); 

    NdefRecord recordNFC = new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, new byte[0], payload); 
    return recordNFC; 
} 

에 태그를 작성합니다. 것은 내가 내가 254를 사용하는 것을 볼 수있다, (그냥 쓰려고, 예외를 throw하지 않습니다) NFC 도구라는 응용 프로그램을 사용

ndef.writeNdefMessage(message); 

동결이 줄없이 이상 254 개 문자를 쓸 수 있다는 것입니다/886 바이트의 사용 가능한 데이터. 나는 앱을 사용하는 태그에 더 쓸 수 없으며, 또한 정지된다.

인코딩 문제라고 생각하여 안드로이드 설명서 Link을 살펴 보았고 태그에 UTF-8 인코딩 된 데이터 만 쓸 수있는 것처럼 보입니다. ASCII 인코딩 데이터를 쓰면 더 많은 공간을 절약 할 수 있습니다.

안드로이드는 쓸 수있는 바이트 수에 제한이 있습니까? 인코딩 문제입니까? 태그에 ASCII로 인코딩 된 텍스트를 직접 쓸 수 있습니까? 나는 정말로 거기에서 길을 잃는다. 도움 주셔서 감사합니다.

답변

0

Android에서 설정하는 제한 사항은 아니지만 기기 관련 버그 일 가능성이 큽니다. Ulefone Armor 2 (Android 7.0, kernel 4.4.15 실행)와 비슷한 문제가 발생했습니다. 다른 장치에서 문제가 발생하지 않았습니다.

인코딩과 관련하여 ASCII로 언급합니다. 또한 안드로이드는 다음과 같이 ASCII를 사용하여 NDEF 레코드 내용을 인코딩 할 수 있습니다.

byte[] dataBytes = token.getBytes(StandardCharsets.US_ASCII); 
    byte[] mimeBytes = VALIDATION_TAG_MIME_TYPE.getBytes(StandardCharsets.US_ASCII); 
    NdefRecord nfcRecord = new NdefRecord(NdefRecord.TNF_EXTERNAL_TYPE, mimeBytes, null, dataBytes);