123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298 |
- 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();
- }
- }
|