hexiii-nfc.js 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. var NfcAdapter;
  2. var NdefRecord;
  3. var NdefMessage;
  4. var _getCardNo;
  5. export default {
  6. initNFC() {
  7. if (uni.getSystemInfoSync().platform == 'android') {
  8. listenNFCStatus()
  9. }
  10. },
  11. readNFC(callback) {
  12. if (uni.getSystemInfoSync().platform == 'android') {
  13. readData(callback);
  14. }
  15. },
  16. closeNFC() {
  17. if (uni.getSystemInfoSync().platform == 'android') {
  18. closeReadAndWrite();
  19. }
  20. }
  21. }
  22. function listenNFCStatus() {
  23. try {
  24. var main = plus.android.runtimeMainActivity();
  25. var Intent = plus.android.importClass('android.content.Intent');
  26. var Activity = plus.android.importClass('android.app.Activity');
  27. var PendingIntent = plus.android.importClass('android.app.PendingIntent');
  28. var IntentFilter = plus.android.importClass('android.content.IntentFilter');
  29. NfcAdapter = plus.android.importClass('android.nfc.NfcAdapter');
  30. var nfcAdapter = NfcAdapter.getDefaultAdapter(main);
  31. if (nfcAdapter == null) {
  32. uni.showToast({
  33. title: '设备不支持NFC!',
  34. icon: 'none'
  35. })
  36. return;
  37. }
  38. if (!nfcAdapter.isEnabled()) {
  39. uni.showToast({
  40. title: '请在系统设置中先启用NFC功能!',
  41. icon: 'none'
  42. });
  43. return;
  44. }
  45. var intent = new Intent(main, main.getClass());
  46. intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
  47. var pendingIntent = PendingIntent.getActivity(main, 0, intent, 0);
  48. var ndef = new IntentFilter("android.nfc.action.TECH_DISCOVERED");
  49. ndef.addDataType("*/*");
  50. var intentFiltersArray = [ndef];
  51. var techListsArray = [
  52. ["android.nfc.tech.IsoDep"],
  53. ["android.nfc.tech.NfcA"],
  54. ["android.nfc.tech.NfcB"],
  55. ["android.nfc.tech.NfcF"],
  56. ["android.nfc.tech.Nfcf"],
  57. ["android.nfc.tech.NfcV"],
  58. ["android.nfc.tech.NdefFormatable"],
  59. ["android.nfc.tech.MifareClassic"],
  60. ["android.nfc.tech.MifareUltralight"]
  61. ];
  62. plus.globalEvent.addEventListener("newintent",
  63. function() {
  64. setTimeout(function(){
  65. handle_nfc_data1()
  66. }, 1000);
  67. }, false);
  68. plus.globalEvent.addEventListener("pause", function(e) {
  69. if (nfcAdapter) {
  70. nfcAdapter.disableForegroundDispatch(main);
  71. }
  72. }, false);
  73. plus.globalEvent.addEventListener("resume", function(e) {
  74. if (nfcAdapter) {
  75. //console.log('resume');
  76. nfcAdapter.enableForegroundDispatch(main, pendingIntent, intentFiltersArray, techListsArray);
  77. }
  78. }, false);
  79. nfcAdapter.enableForegroundDispatch(main, pendingIntent, intentFiltersArray, techListsArray);
  80. } catch (e) {
  81. console.error(e);
  82. }
  83. }
  84. function handle_nfc_data1() {
  85. NdefRecord = plus.android.importClass("android.nfc.NdefRecord");
  86. NdefMessage = plus.android.importClass("android.nfc.NdefMessage");
  87. var main = plus.android.runtimeMainActivity();
  88. var intent = main.getIntent();
  89. //console.log("action type:" + intent.getAction());
  90. if ("android.nfc.action.TECH_DISCOVERED" == intent.getAction()) {
  91. if (readyWriteData) {
  92. __write(intent);
  93. readyWriteData = false;
  94. } else if (readyRead) {
  95. __read(intent);
  96. readyRead = false;
  97. }
  98. }
  99. }
  100. function showToast(msg) {
  101. plus.nativeUI.toast(msg);
  102. }
  103. function __write(intent) {
  104. try {
  105. waiting.setTitle('请勿移开标签\n正在写入...');
  106. var text = document.getElementById('text').value;
  107. console.log("text=" + text);
  108. var textBytes = plus.android.invoke(text, "getBytes");
  109. var textRecord = new NdefRecord(NdefRecord.TNF_MIME_MEDIA,
  110. plus.android.invoke("text/plain", "getBytes"), plus.android.invoke("", "getBytes"), textBytes);
  111. var message = new NdefMessage([textRecord]);
  112. var Ndef = plus.android.importClass('android.nfc.tech.Ndef');
  113. var NdefFormatable = plus.android.importClass('android.nfc.tech.NdefFormatable');
  114. var tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
  115. var ndef = Ndef.get(tag);
  116. if (ndef != null) {
  117. var size = message.toByteArray().length;
  118. console.log("size=" + size);
  119. ndef.connect();
  120. if (!ndef.isWritable()) {
  121. showToast("tag不允许写入");
  122. waiting.close();
  123. return;
  124. }
  125. if (ndef.getMaxSize() < size) {
  126. showToast("文件大小超出容量");
  127. waiting.close();
  128. return;
  129. }
  130. ndef.writeNdefMessage(message);
  131. waiting.close();
  132. showToast("写入数据成功.");
  133. return;
  134. } else {
  135. var format = NdefFormatable.get(tag);
  136. if (format != null) {
  137. try {
  138. format.connect();
  139. format.format(message);
  140. showToast("格式化tag并且写入message");
  141. waiting.close();
  142. return;
  143. } catch (e) {
  144. showToast("格式化tag失败.");
  145. waiting.close();
  146. return;
  147. }
  148. } else {
  149. showToast("Tag不支持NDEF");
  150. waiting.close();
  151. return;
  152. }
  153. }
  154. } catch (e) {
  155. console.log("error=" + e);
  156. waiting.close();
  157. alert('写入失败');
  158. }
  159. }
  160. function __read(intent) {
  161. try {
  162. var content = "";
  163. waiting.setTitle('请勿移开标签\n正在读取数据...');
  164. var tag = plus.android.importClass("android.nfc.Tag");
  165. tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
  166. var bytesId = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
  167. waiting.close();
  168. var tagid = bytesToHexString(tag.getId())
  169. if (typeof _getCardNo === 'function') {
  170. _getCardNo(tagid);
  171. }
  172. } catch (e) {
  173. uni.showToast({
  174. title: e,
  175. icon: 'none'
  176. });
  177. }
  178. }
  179. function bytesToHexString(inarray) {
  180. var i, j, x;
  181. var hex = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A",
  182. "B", "C", "D", "E", "F"
  183. ];
  184. var out = "";
  185. for (j = 0; j < inarray.length; ++j) {
  186. x = parseInt(inarray[j]) & 0xff;
  187. i = (x >> 4) & 0x0f;
  188. out += hex[i];
  189. i = x & 0x0f;
  190. out += hex[i];
  191. }
  192. return out;
  193. }
  194. function reverseTwo(str) {
  195. var str1 = "";
  196. for (var i = 1; i <= str.length; i++) {
  197. str1 += str[i - 1];
  198. if (i % 2 == 0) {
  199. if (i == str.length) {
  200. break;
  201. }
  202. str1 += ":";
  203. }
  204. }
  205. var str2 = "";
  206. for (var i = str1.split(":").length - 1; i >= 0; i--) {
  207. str2 += str1.split(":")[i];
  208. }
  209. return str2;
  210. }
  211. if (uni.getSystemInfoSync().platform == 'android') {
  212. //plus.globalEvent.addEventListener('plusready', listenNFCStatus, false);
  213. }
  214. var waiting;
  215. var readyWriteData = false;
  216. var readyRead = false;
  217. function writeData() {
  218. var textEle = plus.globalEvent.getElementById('text');
  219. if (!textEle.value) {
  220. uni.showToast({
  221. title: '请输入要写入的内容!',
  222. icon: 'none'
  223. });
  224. return;
  225. }
  226. readyWriteData = true;
  227. waiting = plus.nativeUI.showWaiting("请将NFC标签靠近!");
  228. }
  229. function readData(getCardNo) {
  230. readyRead = true;
  231. _getCardNo = getCardNo
  232. waiting = plus.nativeUI.showWaiting("请将NFC标签靠近!", {
  233. modal: false
  234. });
  235. }
  236. function closeReadAndWrite() {
  237. readyWriteData = false;
  238. readyRead = false;
  239. if (waiting) {
  240. waiting.close();
  241. }
  242. }