nfc.plugins.js 8.8 KB

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