hexiii-nfc.js 7.2 KB

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