​
var NfcAdapter;
var NdefRecord;
var NdefMessage;
var _getCardNo;

export default {
	initNFC() {
		if (uni.getSystemInfoSync().platform == 'android') {
			listenNFCStatus()
		}
	},
	readNFC(callback) {
		if (uni.getSystemInfoSync().platform == 'android') {
			readData(callback);
		}
	},
	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];
		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"]
		];
		plus.globalEvent.addEventListener("newintent",
			function() {
				setTimeout(handle_nfc_data1, 1000);
			}, false);
		plus.globalEvent.addEventListener("pause", function(e) {
			if (nfcAdapter) {
				nfcAdapter.disableForegroundDispatch(main);
			}
		}, false);
		plus.globalEvent.addEventListener("resume", function(e) {
			if (nfcAdapter) {
				//console.log('resume'); 
				nfcAdapter.enableForegroundDispatch(main, pendingIntent, intentFiltersArray, techListsArray);
			}
		}, false);
		nfcAdapter.enableForegroundDispatch(main, pendingIntent, intentFiltersArray, techListsArray);
	} catch (e) {
		console.error(e);
	}
}

function handle_nfc_data1() {
	NdefRecord = plus.android.importClass("android.nfc.NdefRecord");
	NdefMessage = plus.android.importClass("android.nfc.NdefMessage");
	var main = plus.android.runtimeMainActivity();
	var intent = main.getIntent();
	//console.log("action type:" + intent.getAction()); 
	if ("android.nfc.action.TECH_DISCOVERED" == intent.getAction()) {
		if (readyWriteData) {
			//__write(intent);
			readyWriteData = false;
		} else if (readyRead) {
			__read(intent);
			readyRead = false;
		}
	}
}

function showToast(msg) {
	plus.nativeUI.toast(msg);
}

// 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('写入失败');
//  }

// }

function __read(intent) {
	try {
		var content = "";
		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())
		if (typeof _getCardNo === 'function') {
			console.log(1111)
			_getCardNo(tagid);
		}else{
			console.log(2222)
		}
	} catch (e) {
		uni.showToast({
			title: e,
			icon: 'none'
		});
	}
}

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

var waiting;
var readyWriteData = false;
var readyRead = false;

function writeData() {
	var textEle = plus.globalEvent.getElementById('text');
	if (!textEle.value) {
		uni.showToast({
			title: '请输入要写入的内容!',
			icon: 'none'
		});
		return;
	}
	readyWriteData = true;
	waiting = plus.nativeUI.showWaiting("请将NFC标签靠近!");
}

function readData(getCardNo) {
	readyRead = true;
	_getCardNo = getCardNo
	waiting = plus.nativeUI.showWaiting("请将NFC标签靠近!", {
		modal: false
	});
}

function closeReadAndWrite() {
	readyWriteData = false;
	readyRead = false;

	if (waiting) {
		waiting.close();
	}
}

​

使用方式:

	import nfc from './nfc.js'

    nfc.initNFC()
    
    function readNFC() {
		nfc.readNFC(getId)
	}

	function getId(res) {
		console.log(res, 'nfcid')
	}

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐