zoukankan      html  css  js  c++  java
  • 11、NFC技术:NDEF Uri格式解析

    NDEF Uri格式规范

    与NDEF文本格式一样,存储在NFC标签中的Uri也有一定的格式

    http://www.nfc-forum.org/specs/spec_dashboard

    编写可以解析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 }
  • 相关阅读:
    了解HTTP Header之User-Agent和HTTP协议的响应码
    怎样才算一个优秀的管理者
    ldpi、mdpi、hdpi、xhdpi、xxhdpi (无内容,待填)
    手把手教做小偷采集
    java中碰到无法解决的问题:无法访问类的getter访问器
    简单的加密解密处理
    Java中处理二进制移位
    Java中实现String.padLeft和String.padRight
    这短短几行代码价值一万
    从一篇文章中检查特定单词出现数量和第一次出现位置
  • 原文地址:https://www.cnblogs.com/androidsj/p/3856433.html
Copyright © 2011-2022 走看看