1. package skyseraph.android.util.nfc;
  2.  
  3. import com.google.common.collect.BiMap;
  4. import com.google.common.collect.ImmutableBiMap;
  5.  
  6. import skyseraph.android.util.LogUtil;
  7. import skyseraph.android.util.MyConstant;
  8.  
  9. import android.annotation.SuppressLint;
  10. import android.net.Uri;
  11. import android.nfc.NdefMessage;
  12. import android.nfc.NdefRecord;
  13.  
  14. import java.nio.charset.Charset;
  15. import java.util.Locale;
  16.  
  17. /**
  18. * @Title :BobNdefMessage.java
  19. * @Package :skyseraph.android.util.nfc
  20. * @ClassName : BobNdefMessage
  21. * @Description :Custom Class For NdefMessage
  22. * @author : skyseraph00@163.com
  23. * @date : 2013-5-13 上午11:14:51
  24. * @version : V1.0 《Android NFC 开发实战详解》
  25. */
  26. public class BobNdefMessage {
  27. private static final String TAG_ASSIST = "[BobNdefMessage]-";
  28.  
  29. /**
  30. * @About:create a TNF_WELL_KNOW NDEF record as RTD_URI
  31. * @param uriFiledStr , The rest of the URI, or the entire URI (if
  32. * identifier code is 0x00).
  33. * @param identifierCode = prefixes(URI identifier code), 0x01=http://www.
  34. * ,0x02=https://www. , 0x03=http://
  35. * @param flagAddAAR, true means add AAR
  36. * @return NdefMessage
  37. * @Ref: NFCForum-TS-RTD_URI_1.0
  38. * @By SkySeraph-2013
  39. */
  40. public static NdefMessage getNdefMsg_from_RTD_URI(String uriFiledStr, byte identifierCode,
  41. boolean flagAddAAR) {
  42. LogUtil.i(MyConstant.TAG, TAG_ASSIST + "into getNdefMsg_from_RTD_URI");
  43. byte[] uriField = uriFiledStr.getBytes(Charset.forName("US-ASCII"));
  44. byte[] payLoad = new byte[uriField.length + 1]; // add 1 for the URI
  45. // Prefix
  46. payLoad[0] = identifierCode; // 0x01 = prefixes http://www. to the URI
  47. // appends URI to payload
  48. System.arraycopy(uriField, 0, payLoad, 1, uriField.length);
  49.  
  50. // Method1:
  51. NdefRecord rtdUriRecord1 = new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_URI,
  52. new byte[0], payLoad);
  53.  
  54. // Method2:only in API 14
  55. String prefix = URI_PREFIX_MAP.get(identifierCode);
  56. NdefRecord rtdUriRecord2 = NdefRecord.createUri(prefix + uriFiledStr);
  57.  
  58. // Method3:only in API 14
  59. NdefRecord rtdUriRecord3 = NdefRecord.createUri(Uri.parse(prefix + uriFiledStr));
  60.  
  61. if (flagAddAAR) {
  62. // note: returns AAR for different app (nfcreadtag)
  63. return new NdefMessage(new NdefRecord[] {
  64. rtdUriRecord1, NdefRecord.createApplicationRecord("skyseraph.nfc_demo")
  65. }); // packageName
  66. } else {
  67. return new NdefMessage(new NdefRecord[] {
  68. rtdUriRecord1
  69. });
  70. }
  71. }
  72.  
  73. /**
  74. * @About:create a TNF_WELL_KNOW NDEF record as RTD_TEXT
  75. * @param text , the really text data
  76. * @param encodeInUtf8 , false means TEXT encoded by UTF-8
  77. * @param flagAddAAR , true means add AAR
  78. * @return NdefMessage
  79. * @Ref: NFCForum-TS-RTD_Text_1.0
  80. * @By SkySeraph-2013
  81. */
  82. public static NdefMessage getNdefMsg_from_RTD_TEXT(String text, boolean encodeInUtf8,
  83. boolean flagAddAAR) {
  84. LogUtil.i(MyConstant.TAG, TAG_ASSIST + "into getNdefMsg_from_RTD_TEXT");
  85.  
  86. Locale locale = new Locale("en", "US"); // a new Locale is created with
  87. // US English.
  88. byte[] langBytes = locale.getLanguage().getBytes(Charset.forName("US-ASCII"));
  89. // boolean encodeInUtf8 = false;
  90. Charset utfEncoding = encodeInUtf8 ? Charset.forName("UTF-8") : Charset.forName("UTF-16");
  91. int utfBit = encodeInUtf8 ? 0 : (1 << 7);
  92. char status = (char)(utfBit + langBytes.length);
  93. // String text = "This is an RTD_TEXT exp";
  94. byte[] textBytes = text.getBytes(utfEncoding);
  95. byte[] data = new byte[1 + langBytes.length + textBytes.length];
  96. data[0] = (byte)status;
  97. System.arraycopy(langBytes, 0, data, 1, langBytes.length);
  98. System.arraycopy(textBytes, 0, data, 1 + langBytes.length, textBytes.length);
  99. NdefRecord textRecord = new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT,
  100. new byte[0], data);
  101.  
  102. if (flagAddAAR) {
  103. // note: returns AAR for different app (nfcreadtag)
  104. return new NdefMessage(new NdefRecord[] {
  105. textRecord, NdefRecord.createApplicationRecord("skyseraph.nfc_demo")
  106. });
  107. } else {
  108. return new NdefMessage(new NdefRecord[] {
  109. textRecord
  110. });
  111. }
  112. }
  113.  
  114. /**
  115. * @About: create a TNF_ABSOLUTE_URI NDEF record
  116. * @param absoluteUri ,the absolute Uri
  117. * @param flagAddAAR , true means add AAR
  118. * @return NdefMessage
  119. * @Note: TNF_ABSOLUTE_URI indicates the absolute form of a URI that follows
  120. * the absolute-URI rule defined by RFC 3986
  121. * @Note: Recommend that you use the RTD_URI type instead of
  122. * TNF_ABSOLUTE_URI, because it is more efficient
  123. * @By SkySeraph-2013
  124. */
  125. public static NdefMessage getNdefMsg_from_ABSOLUTE_URI(String absoluteUri, boolean flagAddAAR) {
  126. LogUtil.i(MyConstant.TAG, TAG_ASSIST + "into getNdefMsg_from_ABSOLUTE_URI");
  127. // String absoluteUri = "http://developer.android.com/index.html";
  128. byte[] absoluteUriBytes = absoluteUri.getBytes(Charset.forName("US-ASCII"));
  129. NdefRecord uriRecord = new NdefRecord(NdefRecord.TNF_ABSOLUTE_URI, absoluteUriBytes,
  130. new byte[0], new byte[0]);
  131. if (flagAddAAR) {
  132. // note: returns AAR for different app (nfcreadtag)
  133. return new NdefMessage(new NdefRecord[] {
  134. uriRecord, NdefRecord.createApplicationRecord("skyseraph.nfc_demo")
  135. });
  136. } else {
  137. return new NdefMessage(new NdefRecord[] {
  138. uriRecord
  139. });
  140. }
  141. }
  142.  
  143. /**
  144. * @About:create a TNF_MIME_MEDIA NDEF record
  145. * @param payLoad,the MIME data
  146. * @param mimeType,the MIME Type
  147. * @param flagAddAAR, true means add AAR
  148. * @return NdefMessage
  149. * @By SkySeraph-2013
  150. */
  151. @SuppressLint("NewApi")
  152. public static NdefMessage getNdefMsg_from_MIME_MEDIA(String payLoad, String mimeType,
  153. boolean flagAddAAR) {
  154. LogUtil.i(MyConstant.TAG, TAG_ASSIST + "into getNdefMsg_from_MIME_MEDIA");
  155. byte[] payLoadBytes = payLoad.getBytes(Charset.forName("US-ASCII"));
  156. // String mimeType = "application/skyseraph.nfc_demo";
  157.  
  158. // method1:Creating the NdefRecord manually
  159. NdefRecord mimeRecord1 = new NdefRecord(NdefRecord.TNF_MIME_MEDIA,
  160. mimeType.getBytes(Charset.forName("US-ASCII")), new byte[0], payLoadBytes);
  161. // the identfier of the record is given as 0, since it will be the first
  162. // record in the NdefMessage
  163.  
  164. // method2:Using the createMime() method, in API-16
  165. NdefRecord mimeRecord2 = NdefRecord.createMime(mimeType, payLoadBytes);
  166.  
  167. if (flagAddAAR) {
  168. // note: returns AAR for different app (nfcreadtag)
  169. return new NdefMessage(new NdefRecord[] {
  170. mimeRecord1, NdefRecord.createApplicationRecord("skyseraph.nfc_demo")
  171. });
  172. } else {
  173. return new NdefMessage(new NdefRecord[] {
  174. mimeRecord1
  175. });
  176. }
  177. }
  178.  
  179. /**
  180. * @About:create a TNF_EXTERNAL_TYPE NDEF record
  181. * @param payLoad,the EXTERNAL data
  182. * @param flagAddAAR, true means add AAR
  183. * @return NdefMessage
  184. * @By SkySeraph-2013
  185. */
  186. @SuppressLint("NewApi")
  187. public static NdefMessage getNdefMsg_from_EXTERNAL_TYPE(String payLoad, boolean flagAddAAR) {
  188. LogUtil.i(MyConstant.TAG, TAG_ASSIST + "into getNdefMsg_from_EXTERNAL_TYPE");
  189. byte[] payLoadBytes = payLoad.getBytes();
  190. String domain = "skyseraph.nfc_demo"; // usually your app's package name
  191. String type = "externalType";
  192. String externalType = domain + ":" + type;
  193.  
  194. // method1:Creating the NdefRecord manually
  195. NdefRecord exteralRecord1 = new NdefRecord(NdefRecord.TNF_EXTERNAL_TYPE,
  196. externalType.getBytes(), new byte[0], payLoadBytes);
  197.  
  198. // method2:Using the createExternal() method, in API-16
  199. NdefRecord exteralRecord2 = NdefRecord.createExternal(domain, type, payLoadBytes);
  200.  
  201. if (flagAddAAR) {
  202. // note: returns AAR for different app (nfcreadtag)
  203. return new NdefMessage(new NdefRecord[] {
  204. exteralRecord1, NdefRecord.createApplicationRecord("skyseraph.nfc_demo")
  205. });
  206. } else {
  207. return new NdefMessage(new NdefRecord[] {
  208. exteralRecord1
  209. });
  210. }
  211. }
  212.  
  213. /**
  214. * checkSystemVersion()
  215. */
  216. private boolean flagVersion = false;
  217.  
  218. private void checkSystemVersion() {
  219. // TODO Auto-generated method stub
  220. // if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
  221.  
  222. LogUtil.i(MyConstant.TAG, TAG_ASSIST + "Product Model=" + android.os.Build.MODEL + ", "
  223. + android.os.Build.VERSION.SDK + ", " + android.os.Build.VERSION.RELEASE);
  224. String systemModel;
  225. String releaseVersion;
  226. String sdkVersion;
  227. systemModel = android.os.Build.MODEL;
  228. sdkVersion = android.os.Build.VERSION.SDK;
  229. releaseVersion = android.os.Build.VERSION.RELEASE;
  230. if (Integer.parseInt(sdkVersion) > 15) {
  231. flagVersion = true;
  232. } else {
  233. flagVersion = false;
  234. LogUtil.e(MyConstant.TAG, TAG_ASSIST + "Your android system version is low to API-16");
  235. }
  236. }
  237.  
  238. /**
  239. * NFC Forum "URI Record Type Definition" This is a mapping of
  240. * "URI Identifier Codes" to URI string prefixes, per section 3.2.2 of the
  241. * NFC Forum URI Record Type Definition document.
  242. */
  243. private static final BiMap<Byte, String> URI_PREFIX_MAP = ImmutableBiMap
  244. .<Byte, String> builder().put((byte)0x00, "").put((byte)0x01, "http://www.")
  245. .put((byte)0x02, "https://www.").put((byte)0x03, "http://").put((byte)0x04, "https://")
  246. .put((byte)0x05, "tel:").put((byte)0x06, "mailto:")
  247. .put((byte)0x07, "ftp://anonymous:anonymous@").put((byte)0x08, "ftp://ftp.")
  248. .put((byte)0x09, "ftps://").put((byte)0x0A, "sftp://").put((byte)0x0B, "smb://")
  249. .put((byte)0x0C, "nfs://").put((byte)0x0D, "ftp://").put((byte)0x0E, "dav://")
  250. .put((byte)0x0F, "news:").put((byte)0x10, "telnet://").put((byte)0x11, "imap:")
  251. .put((byte)0x12, "rtsp://").put((byte)0x13, "urn:").put((byte)0x14, "pop:")
  252. .put((byte)0x15, "sip:").put((byte)0x16, "sips:").put((byte)0x17, "tftp:")
  253. .put((byte)0x18, "btspp://").put((byte)0x19, "btl2cap://").put((byte)0x1A, "btgoep://")
  254. .put((byte)0x1B, "tcpobex://").put((byte)0x1C, "irdaobex://")
  255. .put((byte)0x1D, "file://").put((byte)0x1E, "urn:epc:id:")
  256. .put((byte)0x1F, "urn:epc:tag:").put((byte)0x20, "urn:epc:pat:")
  257. .put((byte)0x21, "urn:epc:raw:").put((byte)0x22, "urn:epc:")
  258. .put((byte)0x23, "urn:nfc:").build();
  259. }

Easy Tag Write(2)的更多相关文章

  1. Easy Tag Write(3.3)

    package skyseraph.android.util; /** * @Title : Constant.java * @Package : tcl.nfc.tv.util * @ClassNa ...

  2. Easy Tag Write(3.2)

    package skyseraph.android.util; /** * @Title : LogUtil.java * @Package : tcl.nfc.phone.util * @Class ...

  3. Easy Tag Write(1)

    package skyseraph.easytagwrite; import skyseraph.android.util.CustomDialog; import skyseraph.android ...

  4. Easy Tag Write(3.1)

    package skyseraph.android.util; import skyseraph.easytagwrite.R; import android.app.Dialog; import a ...

  5. [LeetCode] 70. Climbing Stairs_ Easy tag: Dynamic Programming

    You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...

  6. [LeetCode] 437. Path Sum III_ Easy tag: DFS

    You are given a binary tree in which each node contains an integer value. Find the number of paths t ...

  7. [LeetCode] 257. Binary Tree Paths_ Easy tag: DFS

    Given a binary tree, return all root-to-leaf paths. Note: A leaf is a node with no children. Example ...

  8. [LeetCode] 101. Symmetric Tree_ Easy tag: BFS

    Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...

  9. JUnit5学习之五:标签(Tag)和自定义注解

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

随机推荐

  1. 2016"百度之星" - 资格赛(Astar Round1)

    逆元 1001 Problem A 求前缀哈希和逆元 #include <bits/stdc++.h> typedef long long ll; const int MOD = 9973 ...

  2. java-Lambda表达式

    浏览以下内容前,请点击并阅读 声明 Lambda表达式与匿名类的作用类似,当实现的接口仅有一个方法时,使用lambda表达式能够减少代码的使用量. //此处定义一个仅含有一个抽象方法的功能接口 int ...

  3. 【Linux】vi 命令

    基本上 vi/vim 共分为三种模式,分别是一般模式.编辑模式与指令列命令模式. 这三种模式的作用分别是:     一般模式:以 vi 打开一个档案就直接进入一般模式了(这是默认的模式).在这个模式中 ...

  4. 真刀真枪压测:基于TCPCopy的仿真压测方案

    郑昀 基于刘勤红和石雍志的实践报告 创建于2015/8/13 最后更新于2015/8/19 关键词:压测.TCPCopy.仿真测试.实时拷贝流量 本文档适用人员:技术人员 提纲: 为什么要做仿真测试 ...

  5. [Android]关于Installation error: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED ,修改包名

    查了很多,说修改manifest.本来是没有任何的修改,自动生成的,最后发现参考了人家的一篇: http://bbs.csdn.net/topics/390613702 修改包名,包名带了大些的开头了 ...

  6. Hadoop_UDTF示例

    UDTF: 一进多出 UDTF(User-Defined Table-Generating Function)支持一个输入多个输出, 一般用于解析工作,比如说解析url,然后获取url中的信息 编码: ...

  7. 2016huasacm暑假集训训练三 F - Jungle Roads

    题目链接:http://acm.hust.edu.cn/vjudge/contest/123674#problem/F 题意:在相通n个岛屿的所有桥都坏了,要重修,重修每一个桥所用的时间不同,求重修使 ...

  8. 大端小端系统_union_栈的增长方向

    一道题引发的思考: 1.看一下之前写的union的特点,理解一下共享内存的概念 2.栈的增长方向是从高地址向低地址增长(数组比较特别,a[0]在低地址,a[n-1]在高地址)(堆由低地址到高地址存储) ...

  9. 1.Powershell认识

    Windows PowerShell 是一种命令行外壳程序和脚本环境,自Windows Server 2008开始就有内置于系统当中,有取代CMD之势.管理员使用Powershell完成一些日常重复的 ...

  10. 自动爬取ZiMuZu的内容发布到Wordpress

    先说一下大致的步骤. 首先需要模拟浏览器登录网站才能看到相应电影信息, 然后通过正则表达式从网页源代码中筛选出所需要的电影, 最后通过python-wordpress-xmlrpc将信息逐条发布到Wo ...