• 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();

  • 相关阅读:
    Mybatis-Plus select不列出全部字段
    git合并之 merge和rebase
    git
    springboot缓存开发
    关于Maven打包
    邮件发送模型及其Python应用实例
    Python 日志模块的定制
    python 解析 XML文件
    有限状态机FSM详解及其实现
    动态规划
  • 原文地址:https://www.cnblogs.com/zhoushangwu/p/15871754.html
Copyright © 2020-2023  润新知