1***@qq.com
1***@qq.com
  • 发布:2025-07-30 11:01
  • 更新:2025-07-30 20:53
  • 阅读:130

nfc接入读写app 老是报错报Tag不支持NDEF

分类:uni-app

import store from '@/store/index.js'

// 包路径
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:666,name:aaa,stie:ffff.com}';
let readResult = '';

export default {
listenNFCStatus: function() {
console.log("---------监听NFC状态--------------")
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) {  
                //开启前台调度系统  
                // 优于所有其他NFC  
                nfcAdapter.enableForegroundDispatch(main, pendingIntent, intentFiltersArray,  
                    techListsArray);  
            }  
        });  
        nfcAdapter.enableForegroundDispatch(main, pendingIntent, intentFiltersArray, techListsArray);  
    } catch (e) {  
        console.error(e);  
    }  
},  
nfcRuning: function() { //  
    console.log("--------------NFC 运行---------------")  
    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());  
    if (package_TECH_DISCOVERED == intent.getAction()) {  
        if (readyWriteData) {  
            console.log("----------我在写1-------------")  
            that.write(intent);  
            readyWriteData = false;  
        } else if (readyRead) {  
            console.log("----------我在读1-------------")  
            that.read(intent);  
            readyRead = false;  
        }  
    }  
},  
write(intent) { //写代码  
    console.log("----------我在写-------------",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()) {  
                console.log('tag不允许写入!');  
                return;  
            }  
            if (ndef.getMaxSize() < size) {  
                console.log('文件大小超出容量!');  
                return;  
            }  
            ndef.writeNdefMessage(message); //写入数据  
            console.log('写入数据成功!');  
            return;  
        } else {  
            let format = NdefFormatable.get(tag);  
            if (format != null) {  
                try {  
                    format.connect();  
                    format.format(message);  
                    console.log('格式化tag并且写入message');  
                    return;  
                } catch (e) {  
                    console.log('格式化tag失败.');  
                    return;  
                }  
            } else {  
                console.log('Tag不支持NDEF');  
                return;  
            }  
        }  
    } catch (e) {  
        console.log('写入失败');  
        console.log("error=" + e);  
    }  

},  
read(intent) { // 读代码  
    console.log("----------我在读read-------------")  
    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();  

    console.log("数据" + rawmsgs)  
    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);  
        // 写入vuex  
        store.commit('setNfcReadTxt', data);  
        readResult = data;  
    } else {  
        toast('没有读取到数据');  
    }  
},  
byteArrayToHexString: function(inarray) { // 将字节数组转换为字符串    
    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标签靠近!');  
},  
// close: function(){  

// },  
setTxt: function(txt) {  
    if (noNFC) {  
        toast('请检查设备是否支持并开启 NFC 功能!');  
        return;  
    }  
    text = txt;  
}  

}

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

2025-07-30 11:01 负责人:无 分享
已邀请:
DCloud_UNI_OttoJi

DCloud_UNI_OttoJi - 日常回复 uni-app/x 问题,如果艾特我没看到,请主动私信

硬件问题先自查是不是卡不支持。
你 android.nfc.tech.MifareClassi 是不是拼错了,少了字母

  • 1***@qq.com (作者)

    硬件用测试工具没问题 这个地方好像就是这样的吧

    2025-07-31 21:15

  • DCloud_UNI_OttoJi

    回复 1***@qq.com: 插件市场看下吧,有封装好的 nfc 你可以先对比测试一下,排除硬件的问题 https://ext.dcloud.net.cn/search?q=nfc

    2025-08-01 11:01

要回复问题请先登录注册