uniapp-安卓NFC读取

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') {
			_getCardNo(tagid);
		}
	} 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();
	}
}

  使用

1、引用

import nfc from "@/common/nfc.js"

2、初始化

nfc.initNFC();

3、读取

nfc.readNFC(function(nfcid) {

})

4、关闭读取

nfc.closeNFC();

posted @ 2022-02-08 16:30  我要找到我的全世界  阅读(2733)  评论(0编辑  收藏  举报