11、NFC技术:NDEF Uri格式解析
NDEF Uri格式规范
与NDEF文本格式一样,存储在NFC标签中的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 }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步