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();
岁月无情催人老,请珍爱生命,远离代码!!!