hexiii-nfc.js 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. import store from '@/store/index.js'
  2. // 包路径
  3. const package_NdefRecord = 'android.nfc.NdefRecord';
  4. const package_NdefMessage = 'android.nfc.NdefMessage';
  5. const package_TECH_DISCOVERED = 'android.nfc.action.TECH_DISCOVERED';
  6. const package_Intent = 'android.content.Intent';
  7. const package_Activity = 'android.app.Activity';
  8. const package_PendingIntent = 'android.app.PendingIntent';
  9. const package_IntentFilter = 'android.content.IntentFilter';
  10. const package_NfcAdapter = 'android.nfc.NfcAdapter';
  11. const package_Ndef = 'android.nfc.tech.Ndef';
  12. const package_NdefFormatable = 'android.nfc.tech.NdefFormatable';
  13. const package_Parcelable = 'android.os.Parcelable';
  14. const package_String = 'java.lang.String';
  15. let NfcAdapter;
  16. let NdefRecord;
  17. let NdefMessage;
  18. let readyWriteData = false;//开启写
  19. let readyRead = false;//开启读
  20. let noNFC = false;
  21. let techListsArray = [
  22. ['android.nfc.tech.IsoDep'],
  23. ['android.nfc.tech.NfcA'],
  24. ['android.nfc.tech.NfcB'],
  25. ['android.nfc.tech.NfcF'],
  26. ['android.nfc.tech.Nfcf'],
  27. ['android.nfc.tech.NfcV'],
  28. ['android.nfc.tech.NdefFormatable'],
  29. ['android.nfc.tech.MifareClassic'],
  30. ['android.nfc.tech.MifareClassi'],
  31. ['android.nfc.tech.MifareUltralight']
  32. ];
  33. // 要写入的数据
  34. // let text = '{id:666,name:aaa,stie:ffff.com}';
  35. let text = '';
  36. let readResult = '';
  37. export default {
  38. listenNFCStatus: function () {
  39. console.log("---------监听NFC状态--------------")
  40. let that = this;
  41. try {
  42. let main = plus.android.runtimeMainActivity();
  43. let Intent = plus.android.importClass('android.content.Intent');
  44. let Activity = plus.android.importClass('android.app.Activity');
  45. let PendingIntent = plus.android.importClass('android.app.PendingIntent');
  46. let IntentFilter = plus.android.importClass('android.content.IntentFilter');
  47. NfcAdapter = plus.android.importClass('android.nfc.NfcAdapter');
  48. let nfcAdapter = NfcAdapter.getDefaultAdapter(main);
  49. if (nfcAdapter == null) {
  50. uni.showToast({
  51. title: '设备不支持NFC!',
  52. icon: 'none'
  53. })
  54. noNFC = true;
  55. return;
  56. }
  57. if (!nfcAdapter.isEnabled()) {
  58. uni.showToast({
  59. title: '请在系统设置中先启用NFC功能!',
  60. icon: 'none'
  61. });
  62. noNFC = true;
  63. return;
  64. } else {
  65. noNFC = false;
  66. }
  67. let intent = new Intent(main, main.getClass());
  68. intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
  69. let pendingIntent = PendingIntent.getActivity(main, 0, intent, 0);
  70. let ndef = new IntentFilter("android.nfc.action.TECH_DISCOVERED");
  71. ndef.addDataType("*/*");
  72. let intentFiltersArray = [ndef];
  73. plus.globalEvent.addEventListener('newintent', function () {
  74. console.log('newintent running');
  75. // 轮询调用 NFC
  76. setTimeout(() => that.nfcRuning(), 1000);
  77. });
  78. plus.globalEvent.addEventListener('pause', function (e) {
  79. console.log('pause running');
  80. if (nfcAdapter) {
  81. //关闭前台调度系统
  82. //恢复默认状态
  83. nfcAdapter.disableForegroundDispatch(main);
  84. }
  85. });
  86. plus.globalEvent.addEventListener('resume', function (e) {
  87. console.log('resume running');
  88. if (nfcAdapter) {
  89. //开启前台调度系统
  90. // 优于所有其他NFC
  91. nfcAdapter.enableForegroundDispatch(main, pendingIntent, intentFiltersArray, techListsArray);
  92. }
  93. });
  94. nfcAdapter.enableForegroundDispatch(main, pendingIntent, intentFiltersArray, techListsArray);
  95. } catch (e) {
  96. console.error(e);
  97. }
  98. },
  99. nfcRuning: function () {
  100. console.log("--------------NFC 运行---------------")
  101. NdefRecord = plus.android.importClass("android.nfc.NdefRecord");
  102. NdefMessage = plus.android.importClass("android.nfc.NdefMessage");
  103. let main = plus.android.runtimeMainActivity();
  104. let intent = main.getIntent();
  105. let that = this;
  106. console.log("action type:" + intent.getAction());
  107. console.log(package_TECH_DISCOVERED == intent.getAction());
  108. if (package_TECH_DISCOVERED == intent.getAction()) {
  109. if (readyWriteData) {
  110. console.log("----------我在写1-------------")
  111. that.write(intent);
  112. readyWriteData = false;
  113. } else if (readyRead) {
  114. console.log("----------我在读1-------------")
  115. that.read(intent);
  116. readyRead = false;
  117. }
  118. }
  119. },
  120. write(intent) { //写代码
  121. console.log("----------我在写-------------")
  122. let that = this
  123. try {
  124. toast('请勿移开标签 正在写入...');
  125. console.log("text=" + text);
  126. let textBytes = plus.android.invoke(text, "getBytes");
  127. // image/jpeg text/plain
  128. let textRecord = new NdefRecord(NdefRecord.TNF_MIME_MEDIA,
  129. plus.android.invoke("text/plain", "getBytes"),
  130. plus.android.invoke("", "getBytes"), textBytes);
  131. let message = new NdefMessage([textRecord]);
  132. let Ndef = plus.android.importClass('android.nfc.tech.Ndef');
  133. let NdefFormatable = plus.android.importClass('android.nfc.tech.NdefFormatable');
  134. let tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
  135. console.log(tag.toString(), '90909')
  136. let ndef = Ndef.get(tag);
  137. console.log(ndef,'ndef------')
  138. if (ndef != null) {
  139. // 待写入的数据长度
  140. let size = message.toByteArray().length;
  141. ndef.connect();
  142. if (!ndef.isWritable()) {
  143. toast('tag不允许写入!');
  144. return;
  145. }
  146. if (ndef.getMaxSize() < size) {
  147. toast('文件大小超出容量!');
  148. return;
  149. }
  150. ndef.writeNdefMessage(message); //写入数据
  151. toast('写入数据成功!');
  152. return;
  153. } else {
  154. let format = NdefFormatable.get(tag);
  155. console.log(format,'format-----------------------')
  156. if (format != null) {
  157. try {
  158. format.connect();
  159. format.format(message);
  160. toast('格式化tag并且写入message');
  161. setTimeout(()=>{
  162. that.writeData()
  163. },1000)
  164. return;
  165. } catch (e) {
  166. toast('格式化tag失败.');
  167. return;
  168. }
  169. } else {
  170. toast('Tag不支持NDEF');
  171. return;
  172. }
  173. }
  174. } catch (e) {
  175. toast('写入失败');
  176. console.log("error=" + e);
  177. }
  178. },
  179. read(intent) { // 读代码
  180. console.log("----------我在读read-------------")
  181. toast('请勿移开标签正在读取数据');
  182. let that = this;
  183. // NFC id
  184. let bytesId = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
  185. let nfc_id = that.byteArrayToHexString(bytesId);
  186. console.log('nfc_id:', nfc_id);
  187. let Parcelable = plus.android.importClass("android.os.Parcelable");
  188. let rawmsgs = intent.getParcelableArrayExtra("android.nfc.extra.NDEF_MESSAGES");
  189. //let rawmsgs = intent.getParcelableArrayExtra();
  190. console.log("数据" + rawmsgs)
  191. if (rawmsgs != null && rawmsgs.length > 0) {
  192. let records = rawmsgs[0].getRecords();
  193. let result = records[0].getPayload();
  194. let data = plus.android.newObject("java.lang.String", result);
  195. // 写入vuex
  196. store.commit('setNfcReadTxt', data);
  197. toast('NFC 数据:' + data);
  198. readResult = data;
  199. } else {
  200. toast('没有读取到数据');
  201. }
  202. },
  203. byteArrayToHexString: function (inarray) { // 将字节数组转换为字符串
  204. let i, j, inn;
  205. let hex = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"];
  206. let out = "";
  207. for (j = 0; j < inarray.length; ++j) {
  208. inn = inarray[j] & 0xff;
  209. i = (inn >>> 4) & 0x0f;
  210. out += hex[i];
  211. i = inn & 0x0f;
  212. out += hex[i];
  213. }
  214. return out;
  215. },
  216. writeData: function () { // 更改写状态
  217. if (noNFC) {
  218. toast('请检查设备是否支持并开启 NFC 功能!');
  219. return;
  220. }
  221. // 轮询条件
  222. readyWriteData = true;
  223. toast('请将NFC标签靠近!');
  224. },
  225. readData: function () { // 更改读状态
  226. if (noNFC) {
  227. toast('请检查设备是否支持并开启 NFC 功能!');
  228. return;
  229. }
  230. // 轮询条件
  231. readyRead = true;
  232. toast('请将NFC标签靠近!');
  233. },
  234. setTxt: function (txt) {
  235. if (noNFC) {
  236. toast('请检查设备是否支持并开启 NFC 功能!');
  237. return;
  238. }
  239. text = txt;
  240. }
  241. }
  242. function toast(content) {
  243. uni.showToast({
  244. title: content,
  245. icon: 'none'
  246. })
  247. }