NDEF文本格式規范
不管什么格式的數據本質上都是由一些字節組成的。對於NDEF文本格式來說。這些數據的第1個字節描述了數據的狀態,然后若干個字節描述文本的語言編碼,最后剩余字節表示文本數據。這些數據格式由NFC Forum的相關規范定義,可以從下面的地址下載相關的規范。
http://www.nfc-forum.org/specs/spec_dashboard
NDEF文本數據格式

狀態字節編碼格式

判斷數據是否為NDEF格式
獲取NFC標簽中的數據要通過NdefRecord.getPayload方法完成。當然,在處理這些數據之前,最好判斷一下NdefRecord對象中存儲的是不是NDEF文本格式數據。
判斷的標准有如下兩個
TNF(類型名格式,Type Name Format)必須是NdefRecord.TNF_WELL_KNOWN。
可變的長度類型必須是NdefRecord.RTD_TEXT。
1 import java.util.Arrays; 2 import android.nfc.NdefRecord; 3 4 /** 5 * 將NDEFRecord 文本數據解析出來,生成TextRecord對象 6 * @author dr 7 * 8 */ 9 public class TextRecord { 10 // 解析出來文本放到該對象中。 11 private final String mText; 12 13 private TextRecord(String text) { 14 mText = text; 15 } 16 17 public String getText() { 18 return mText; 19 } 20 21 /** 22 * 解析 ndefRecord 文本數據 23 * @param ndefRecord 24 * @return 25 */ 26 public static TextRecord parse(NdefRecord ndefRecord) { 27 // verify tnf 得到TNF的值 28 if (ndefRecord.getTnf() != NdefRecord.TNF_WELL_KNOWN) { 29 return null; 30 } 31 // 得到字節數組進行判斷 32 if (!Arrays.equals(ndefRecord.getType(), NdefRecord.RTD_TEXT)) { 33 return null; 34 } 35 36 try { 37 // 獲得一個字節流 38 byte[] payload = ndefRecord.getPayload(); 39 // payload[0]取第一個字節。 0x80:十六進制(最高位是1剩下全是0) 40 String textEncoding = ((payload[0] & 0x80) == 0) ? "UTF-8" 41 : "UTF-16"; 42 // 獲得語言編碼長度 43 int languageCodeLength = payload[0] & 0x3f; 44 // 獲得語言編碼 45 String languageCode = new String(payload, 1, languageCodeLength, 46 "US-ASCII"); 47 // 48 String text = new String(payload, languageCodeLength + 1, 49 payload.length - languageCodeLength - 1, textEncoding); 50 51 return new TextRecord(text); 52 53 } catch (Exception e) { 54 throw new IllegalArgumentException(); 55 } 56 } 57 58 }