NDEF Uri格式规范




编写可以解析Uri格式数据的类


 


1 import java.nio.charset.Charset;
2 import java.util.Arrays;
3 import java.util.HashMap;
4 import java.util.Map;
5 import android.net.Uri;
6 import android.nfc.NdefRecord;
7
8 public class UriRecord {
9 public static final Map<Byte, String> URI_PREFIX_MAP = new HashMap<Byte, String>();
10 static {
11 URI_PREFIX_MAP.put((byte) 0x00, "");
12 URI_PREFIX_MAP.put((byte) 0x01, "http://www.");
13 URI_PREFIX_MAP.put((byte) 0x02, "https://www.");
14 URI_PREFIX_MAP.put((byte) 0x03, "http://");
15 URI_PREFIX_MAP.put((byte) 0x04, "https://");
16 URI_PREFIX_MAP.put((byte) 0x05, "tel:");
17 URI_PREFIX_MAP.put((byte) 0x06, "mailto:");
18 URI_PREFIX_MAP.put((byte) 0x07, "ftp://anonymous:anonymous@");
19 URI_PREFIX_MAP.put((byte) 0x08, "ftp://ftp.");
20 URI_PREFIX_MAP.put((byte) 0x09, "ftps://");
21 URI_PREFIX_MAP.put((byte) 0x0A, "sftp://");
22 URI_PREFIX_MAP.put((byte) 0x0B, "smb://");
23 URI_PREFIX_MAP.put((byte) 0x0C, "nfs://");
24 URI_PREFIX_MAP.put((byte) 0x0D, "ftp://");
25 URI_PREFIX_MAP.put((byte) 0x0E, "dav://");
26 URI_PREFIX_MAP.put((byte) 0x0F, "news:");
27 URI_PREFIX_MAP.put((byte) 0x10, "telnet://");
28 URI_PREFIX_MAP.put((byte) 0x11, "imap:");
29 URI_PREFIX_MAP.put((byte) 0x12, "rtsp://");
30 URI_PREFIX_MAP.put((byte) 0x13, "urn:");
31 URI_PREFIX_MAP.put((byte) 0x14, "pop:");
32 URI_PREFIX_MAP.put((byte) 0x15, "sip:");
33 URI_PREFIX_MAP.put((byte) 0x16, "sips:");
34 URI_PREFIX_MAP.put((byte) 0x17, "tftp:");
35 URI_PREFIX_MAP.put((byte) 0x18, "btspp://");
36 URI_PREFIX_MAP.put((byte) 0x19, "btl2cap://");
37 URI_PREFIX_MAP.put((byte) 0x1A, "btgoep://");
38 URI_PREFIX_MAP.put((byte) 0x1B, "tcpobex://");
39 URI_PREFIX_MAP.put((byte) 0x1C, "irdaobex://");
40 URI_PREFIX_MAP.put((byte) 0x1D, "file://");
41 URI_PREFIX_MAP.put((byte) 0x1E, "urn:epc:id:");
42 URI_PREFIX_MAP.put((byte) 0x1F, "urn:epc:tag:");
43 URI_PREFIX_MAP.put((byte) 0x20, "urn:epc:pat:");
44 URI_PREFIX_MAP.put((byte) 0x21, "urn:epc:raw:");
45 URI_PREFIX_MAP.put((byte) 0x22, "urn:epc:");
46 URI_PREFIX_MAP.put((byte) 0x23, "urn:nfc:");
47 }
48 private final Uri mUri;
49
50 private UriRecord(Uri uri) {
51 this.mUri = uri;
52 }
53
54 public Uri getUri() {
55 return mUri;
56 }
57
58 private static UriRecord parseAbsolute(NdefRecord ndefRecord) {
59 // 获得字节数据
60 byte[] payload = ndefRecord.getPayload();
61 // 把字符串转换成Uri对象。
62 Uri uri = Uri.parse(new String(payload, Charset.forName("UTF-8")));
63 return new UriRecord(uri);
64 }
65
66 /**
67 * 处理已知类型的URI
68 * @param ndefRecord
69 * @return
70 */
71 private static UriRecord parseWellKnown(NdefRecord ndefRecord) {
72 if (!Arrays.equals(ndefRecord.getType(), NdefRecord.RTD_URI))
73 return null;
74 // 获得所有字节数据
75 byte[] payload = ndefRecord.getPayload();
76 // 获得前缀(根据前面的隐射,查找对应的数据)
77 String prefix = URI_PREFIX_MAP.get(payload[0]);
78 byte[] prefixBytes = prefix.getBytes(Charset.forName("UTF-8"));
79 // 减 1 ,是隐射编码的长度。
80 byte[] fullUri = new byte[prefixBytes.length + payload.length - 1];
81 // 数组拷贝
82 System.arraycopy(prefixBytes, 0, fullUri, 0, prefixBytes.length);
83 System.arraycopy(payload, 1, fullUri, prefixBytes.length,
84 payload.length - 1);
85 // 生成一个URI。
86 Uri uri = Uri.parse(new String(fullUri, Charset.forName("UTF-8")));
87 return new UriRecord(uri);
88 }
89
90 /**
91 *
92 * @param record
93 * @return
94 */
95 public static UriRecord parse(NdefRecord record) {
96 short tnf = record.getTnf();
97 if (tnf == NdefRecord.TNF_WELL_KNOWN) {
98 return parseWellKnown(record);
99 } else if (tnf == NdefRecord.TNF_ABSOLUTE_URI) {
100 return parseAbsolute(record);
101 }
102 throw new IllegalArgumentException("Unknown TNF " + tnf);
103 }
104 }