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 }