uniapp唤起nfc附带Dom

代码地址```bash
// 包路径
const package_NdefRecord = ‘android.nfc.NdefRecord’;
const package_NdefMessage = ‘android.nfc.NdefMessage’;
const package_TECH_DISCOVERED = ‘android.nfc.action.TECH_DISCOVERED’;
const package_Intent = ‘android.content.Intent’;
const package_Activity = ‘android.app.Activity’;
const package_PendingIntent = ‘android.app.PendingIntent’;
const package_IntentFilter = ‘android.content.IntentFilter’;
const package_NfcAdapter = ‘android.nfc.NfcAdapter’;
const package_Ndef = ‘android.nfc.tech.Ndef’;
const package_NdefFormatable = ‘android.nfc.tech.NdefFormatable’;
const package_Parcelable = ‘android.os.Parcelable’;
const package_String = ‘java.lang.String’;

let NfcAdapter;
let NdefRecord;
let NdefMessage;
let readyWriteData = false;
let readyRead = false;
let noNFC = false;
let 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.MifareClassi’],
[‘android.nfc.tech.MifareUltralight’]
];
// 要写入的数据
let text = ‘{id:123,name:nfc,stie:cssmini.com}’;
let readResult = ‘’;

export default {
listenNFCStatus: function () {
let that = this;
try {
let main = plus.android.runtimeMainActivity();
let Intent = plus.android.importClass(‘android.content.Intent’);
let Activity = plus.android.importClass(‘android.app.Activity’);
let PendingIntent = plus.android.importClass(‘android.app.PendingIntent’);
let IntentFilter = plus.android.importClass(‘android.content.IntentFilter’);
NfcAdapter = plus.android.importClass(‘android.nfc.NfcAdapter’);
let nfcAdapter = NfcAdapter.getDefaultAdapter(main);

		if(nfcAdapter == null){
			uni.showToast({
			  title: '设备不支持NFC!',
			  icon: 'none'
			})
			noNFC = true;
			return;
		}
		
		if (!nfcAdapter.isEnabled()) {
			uni.showToast({
			  title: '请在系统设置中先启用NFC功能!',
			  icon: 'none'
			});
			noNFC = true;
			return;
		}else{
			noNFC = false;
		}
		
		let intent = new Intent(main, main.getClass());
		intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
		let pendingIntent = PendingIntent.getActivity(main, 0, intent, 0);
		let ndef = new IntentFilter("android.nfc.action.TECH_DISCOVERED");
		ndef.addDataType("*/*");
		let intentFiltersArray = [ndef];
		
		plus.globalEvent.addEventListener('newintent',function() {
			console.log('newintent running');
			// 监听 NFC
			setTimeout(that.nfcRuning(), 1000);
		});
		plus.globalEvent.addEventListener('pause',function(e) {
			console.log('pause running');
			if (nfcAdapter) {
				//关闭前台调度系统
				//恢复默认状态
				nfcAdapter.disableForegroundDispatch(main);
			}
		});
		plus.globalEvent.addEventListener('resume',function(e) {
			console.log('resume running');
			if (nfcAdapter) {
				 //开启前台调度系统
				nfcAdapter.enableForegroundDispatch(main, pendingIntent, intentFiltersArray, techListsArray);
			}
		});
		nfcAdapter.enableForegroundDispatch(main, pendingIntent, intentFiltersArray, techListsArray); 
	} catch (e) {
		console.error(e);
	}
},
nfcRuning: function () {
	NdefRecord = plus.android.importClass("android.nfc.NdefRecord");
	NdefMessage = plus.android.importClass("android.nfc.NdefMessage");
	let main = plus.android.runtimeMainActivity();
	let intent = main.getIntent();
	let that = this;
	
	console.log("action type:" + intent.getAction());
	
	if (package_TECH_DISCOVERED == intent.getAction()) {
		if (readyWriteData) {
			that.write(intent);
			readyWriteData = false;
		} else if (readyRead) {
			that.read(intent);
			readyRead = false;
		}
	}
},
write(intent) {
	try {
		toast('请勿移开标签 正在写入...');
		console.log("text=" + text);
		
		let textBytes = plus.android.invoke(text, "getBytes");
		// image/jpeg text/plain  
		let textRecord = new NdefRecord(NdefRecord.TNF_MIME_MEDIA,
										plus.android.invoke("text/plain", "getBytes"),  
										plus.android.invoke("", "getBytes"), textBytes);
		let message = new NdefMessage([textRecord]);
		let Ndef = plus.android.importClass('android.nfc.tech.Ndef');
		let NdefFormatable = plus.android.importClass('android.nfc.tech.NdefFormatable');
		let tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
		let ndef = Ndef.get(tag);
		if (ndef != null) {
			// 待写入的数据长度
			let size = message.toByteArray().length;
			ndef.connect();
			if (!ndef.isWritable()) {
				toast('tag不允许写入!');
				return;
			}
			if (ndef.getMaxSize() < size) {
				toast('文件大小超出容量!');
				return;
			}
			ndef.writeNdefMessage(message);
			toast('写入数据成功!');
			return;
		} else {
			let format = NdefFormatable.get(tag);
			if (format != null) {
				try {
					format.connect();
					format.format(message);
					toast('格式化tag并且写入message');
					return;
				} catch (e) {
					toast('格式化tag失败.');
					return;
				}
			} else {
				toast('Tag不支持NDEF');
				return;
			}
		}
	} catch (e) {
		toast('写入失败');
		console.log("error=" + e);
	}

},
read(intent) {
	toast('请勿移开标签正在读取数据');
	let that = this;
	// NFC id
	let bytesId = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
	let nfc_id = that.byteArrayToHexString(bytesId);
	console.log('nfc_id:', nfc_id);
	let Parcelable = plus.android.importClass("android.os.Parcelable");
	let rawmsgs = intent.getParcelableArrayExtra("android.nfc.extra.NDEF_MESSAGES");
	//let rawmsgs = intent.getParcelableArrayExtra();
	
	if(rawmsgs != null && rawmsgs.length > 0) {
		let records = rawmsgs[0].getRecords();
		let result = records[0].getPayload();
		let data = plus.android.newObject("java.lang.String", result);
		toast('NFC 数据:' + data);
		console.log('NFC 数据:',data);
		readResult = data;
	}else{
		toast('没有读取到数据');
	}
},
byteArrayToHexString: function (inarray) { // converts byte arrays to string  
	let i, j, inn;  
	let hex = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"];  
	let out = "";  
	
	for(j = 0; j < inarray.length; ++j) {
		inn = inarray[j] & 0xff;  
		i = (inn >>> 4) & 0x0f;  
		out += hex[i];  
		i = inn & 0x0f;  
		out += hex[i];  
	}  
	return out;  
},
writeData: function () {
	if(noNFC){
		toast('请检查设备是否支持并开启 NFC 功能!');
		return;
	}
	// 监听事件,触发条件
	readyWriteData = true;
	toast('请将NFC标签靠近!');
},
readData: function () {
	if(noNFC){
		toast('请检查设备是否支持并开启 NFC 功能!');
		return;
	}
	// 监听事件,触发条件
	readyRead = true;
	toast('请将NFC标签靠近!');
}

}
function toast(content){
uni.showToast({
title: content,
icon: ‘none’
})
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值