前端DEMO
前端DEMO
  • 发布:2021-09-24 12:13
  • 更新:2021-09-24 12:13
  • 阅读:486

用Native.js开发NFC,如何实现关闭监听?

分类:Native.js

代码中listenNFCStatus函数初始化运行后,就一直在监听nfc,本意想在使用的时候初始化,在不使用的时候关闭监听,请问如何实现。代码如下nfcClose函数如何结束监听。

// 包路径  
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 readyRead = true; //开启读  
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']  
];  
export default {  
    listenNFCStatus: function() {  
        console.log("---------listenNFCStatus--------------")  
        let that = this;  
        try {  
            let main = plus.android.runtimeMainActivity();  
            let Intent = plus.android.importClass('android.content.Intent');  
            let Activity = plus.android.importClass('android.content.Intent');  
            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) {  
                toast('设备不支持NFC!')  
                noNFC = true;  
                return;  
            }  
            if (!nfcAdapter.isEnabled()) {  
                toast('请在系统设置中先启用NFC功能!')  
                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];  
            //重点部分代码  
            const promise = new Promise((resolve, reject) => {  
                plus.globalEvent.addEventListener("newintent", function() {  
                    // 轮询调用 NFC  
                    setTimeout(() => {  
                        that.nfcRuning(resolve)  
                    }, 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) {  
                    //开启前台调度系统  
                    // 优于所有其他NFC  
                    nfcAdapter.enableForegroundDispatch(main, pendingIntent, intentFiltersArray,  
                        techListsArray);  
                }  
            });  
            nfcAdapter.enableForegroundDispatch(main, pendingIntent, intentFiltersArray, techListsArray);  
            return promise  
        } catch (e) {  
            console.error(e);  
        }  
    },  
    nfcRuning: function(resolve) {  
        console.log("--------------nfcRuning---------------")  
        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());  
        console.log(package_TECH_DISCOVERED == intent.getAction());  
        console.log('readyRead', readyRead);  
        if (package_TECH_DISCOVERED == intent.getAction()) {  
            if (readyWriteData) {  
                console.log("----------我在写1-------------")  
                that.write(intent);  
                readyWriteData = false;  
            } else if (readyRead) {  
                console.log("----------我在读1-------------")  
                const id = that.read(intent);  
                //将数据返回出去  
                resolve(id)  
                // readyRead = false;  
            }  
        }  
    },  
    read(intent) {  
        console.log("----------我在读read-------------")  
        toast('请勿移开标签正在读取数据');  
        let that = this;  
        // NFC id  
        let bytesId = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);  
        let nfc_id = that.byteArrayToHexString(bytesId);  
        return nfc_id  
    },  
    readData: function() {  
        if (noNFC) {  
            toast('请检查设备是否支持并开启 NFC 功能!');  
            return;  
        }  
        // 轮询条件  
        readyRead = true;  
        toast('请将NFC标签靠近!');  
    },  
    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;  
    },  
    nfcClose: function() {  
        // 关闭nfc监听  
        console.log('')  
    }  
}  

function toast(content) {  
    uni.showToast({  
        title: content,  
        icon: 'none'  
    })  
}
2021-09-24 12:13 负责人:无 分享
已邀请:

该问题目前已经被锁定, 无法添加新回复