import tab from "./tab.plugins"; import { settingStores } from "@/store/modules/index"; var NfcAdapter; var NdefRecord; var NdefMessage; var waiting; var readyWriteData = false; //开启写 var readyRead = false; //开启读 var whetherNFC = false; //是否有NFC var techListsArray = [ ["android.nfc.tech.IsoDep"], ["android.nfc.tech.NfcA"], ["android.nfc.tech.NfcB"], ["android.nfc.tech.NfcF"], ["android.nfc.tech.Nfcf"], ["android.nfc.tech.NfcV"], ["android.nfc.tech.NdefFormatable"], ["android.nfc.tech.MifareClassic"], ["android.nfc.tech.MifareUltralight"], ]; export default { initNFC() { if (uni.getSystemInfoSync().platform == "android") { listenNFCStatus() } if (uni.getSystemInfoSync().platform == "ios") { uni.showToast({ title: "设备不支持NFC!", icon: "none", }); return; } }, readNFC(callback) { return new Promise((resolve, reject) => { if (uni.getSystemInfoSync().platform == "android") { plus.globalEvent.addEventListener("newintent", function () { readyRead = true; //开启读 plus.device.vibrate(500); //调用手机震动 settingStores().nfcWaiting = '请将手机靠近NFC标签' handleNFCData().then((event) => { resolve(event) }) }, false); } }) }, closeNFC() { if (uni.getSystemInfoSync().platform == "android") { closeReadAndWrite(); } } } function listenNFCStatus() { try { var main = plus.android.runtimeMainActivity(); var Intent = plus.android.importClass("android.content.Intent"); var Activity = plus.android.importClass("android.app.Activity"); var PendingIntent = plus.android.importClass("android.app.PendingIntent"); var IntentFilter = plus.android.importClass("android.content.IntentFilter"); NfcAdapter = plus.android.importClass("android.nfc.NfcAdapter"); var nfcAdapter = NfcAdapter.getDefaultAdapter(main); if (nfcAdapter == null) { uni.showToast({ title: "设备不支持NFC!", icon: "none", }); return; } if (!nfcAdapter.isEnabled()) { uni.showToast({ title: "请在系统设置中先启用NFC功能!", icon: "none", }); return; } var intent = new Intent(main, main.getClass()); intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); var pendingIntent = PendingIntent.getActivity(main, 0, intent, 0); var ndef = new IntentFilter("android.nfc.action.TECH_DISCOVERED"); ndef.addDataType("*/*"); var intentFiltersArray = [ndef]; plus.globalEvent.addEventListener( "pause", function (e) { if (nfcAdapter) { //关闭前台调度系统 //恢复默认状态 nfcAdapter.disableForegroundDispatch(main); } }, false ); plus.globalEvent.addEventListener( "resume", function (e) { if (nfcAdapter) { //开启前台调度系统 // 优于所有其他NFC nfcAdapter.enableForegroundDispatch(main, pendingIntent, intentFiltersArray, techListsArray); } }, false ); nfcAdapter.enableForegroundDispatch(main, pendingIntent, intentFiltersArray, techListsArray); } catch (e) { console.error(e); } } function handleNFCData() { return new Promise((resolve, reject) => { NdefRecord = plus.android.importClass("android.nfc.NdefRecord"); NdefMessage = plus.android.importClass("android.nfc.NdefMessage"); var main = plus.android.runtimeMainActivity(); var intent = main.getIntent(); if ("android.nfc.action.TECH_DISCOVERED" == intent.getAction()) { if (readyWriteData) { //__write(intent); readyWriteData = false; } else if (readyRead) { __read(intent).then((event) => { resolve(event) }); readyRead = false; } } }) } /** * @NFC写入 * @param {*} intent * @returns */ function __write(intent) { try { waiting.setTitle("请勿移开标签\n正在写入..."); var text = document.getElementById("text").value; console.log("text=" + text); var textBytes = plus.android.invoke(text, "getBytes"); var textRecord = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, plus.android.invoke("text/plain", "getBytes"), plus.android.invoke("", "getBytes"), textBytes); var message = new NdefMessage([textRecord]); var Ndef = plus.android.importClass("android.nfc.tech.Ndef"); var NdefFormatable = plus.android.importClass("android.nfc.tech.NdefFormatable"); var tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); var ndef = Ndef.get(tag); if (ndef != null) { var size = message.toByteArray().length; console.log("size=" + size); ndef.connect(); if (!ndef.isWritable()) { showToast("tag不允许写入"); waiting.close(); return; } if (ndef.getMaxSize() < size) { showToast("文件大小超出容量"); waiting.close(); return; } ndef.writeNdefMessage(message); waiting.close(); showToast("写入数据成功."); return; } else { var format = NdefFormatable.get(tag); if (format != null) { try { format.connect(); format.format(message); showToast("格式化tag并且写入message"); waiting.close(); return; } catch (e) { showToast("格式化tag失败."); waiting.close(); return; } } else { showToast("Tag不支持NDEF"); waiting.close(); return; } } } catch (e) { console.log("error=" + e); waiting.close(); alert("写入失败"); } } /** * @NFC读取 * @param {*} intent * @returns */ function __read(intent) { return new Promise((resolve, reject) => { try { settingStores().nfcWaiting = '请勿移开标签\n正在读取数据...' // waiting.setTitle("请勿移开标签\n正在读取数据..."); var tag = plus.android.importClass("android.nfc.Tag"); tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); var bytesId = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID); // waiting.close(); var tagid = bytesToHexString(tag.getId()); resolve(tagid) } catch (e) { uni.showToast({ title: e, icon: "none", }); } }) } /** * @十六进制转换 * @param { 值 } inarray * @returns */ function bytesToHexString(inarray) { var i, j, x; var hex = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"]; var out = ""; for (j = 0; j < inarray.length; ++j) { x = parseInt(inarray[j]) & 0xff; i = (x >> 4) & 0x0f; out += hex[i]; i = x & 0x0f; out += hex[i]; } return out; } function reverseTwo(str) { var str1 = ""; for (var i = 1; i <= str.length; i++) { str1 += str[i - 1]; if (i % 2 == 0) { if (i == str.length) { break; } str1 += ":"; } } var str2 = ""; for (var i = str1.split(":").length - 1; i >= 0; i--) { str2 += str1.split(":")[i]; } return str2; } if (uni.getSystemInfoSync().platform == "android") { //plus.globalEvent.addEventListener('plusready', listenNFCStatus, false); } function writeData() { var textEle = plus.globalEvent.getElementById("text"); if (!textEle.value) { uni.showToast({ title: "请输入要写入的内容!", icon: "none", }); return; } readyWriteData = true; settingStores().nfcWaiting = '请将手机靠近NFC标签' // waiting = plus.nativeUI.showWaiting("请将手机靠近NFC标签!"); } function showToast(msg) { plus.nativeUI.toast(msg); } /** * @关闭NFC */ function closeReadAndWrite() { readyWriteData = false; readyRead = false; if (waiting) { waiting.close(); } }