uni-app NFC读写标签数据

发布于 1周前 作者 vueper 来自 Uni-App

uni-app NFC读写标签数据

应一些同学的需要,在此专门对NFC读写Tag标签进行适配,如遇到相关什么问题在此贴进行讨论学习,代码如下,

<!DOCTYPE html>  
<html>  
    <head>  
        <meta charset="utf-8">  
        <title></title>  
        <script>  
            var NfcAdapter;  
            var NdefRecord;  
            var NdefMessage;  
            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);  
                    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.MifareClassi"],  
                        ["android.nfc.tech.MifareUltralight"]  
                    ];  
                    document.addEventListener("newintent",  
                        function() {  
                            console.error('newintent');  
                            setTimeout(handle_nfc_data1, 1000);  
                        }, false);  
                    document.addEventListener("pause", function(e) {  
                        if (nfcAdapter) {  
                            nfcAdapter.disableForegroundDispatch(main);  
                            console.log('pause');  
                        }  
                    }, false);  
                    document.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");  
                    // image/jpeg text/plain  
                    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){  
                waiting.setTitle('请勿移开标签\n正在读取数据...');  
                var Parcelable = plus.android.importClass("android.os.Parcelable");  
                var rawmsgs = intent.getParcelableArrayExtra("android.nfc.extra.NDEF_MESSAGES");  
                records = rawmsgs[0].getRecords();  
                var result = records[0].getPayload();  
                var s = plus.android.newObject("java.lang.String",result);  
                document.getElementById('content').textContent = s;  
                waiting.close();  
            }  
            document.addEventListener('plusready',listenNFCStatus,false);  

            var waiting ;  
            var readyWriteData = false;  
            var readyRead = false;  
            function writeData(){  
                var textEle = document.getElementById('text');  
                if(!textEle.value){  
                    alert('请输入要写入的内容');  
                    return;  
                }  
                readyWriteData = true;  
                waiting = plus.nativeUI.showWaiting("请将NFC标签靠近!");  
            }  
            function readData(){  
                readyRead = true;  
                waiting = plus.nativeUI.showWaiting("请将NFC标签靠近!");  
            }  
        </script>  

        <style>  
            button{  
                width: 50%;  
                height: 50px;  
            }  
        </style>  
    </head>  
    <body>  
        输入要写入的内容:<br/><textarea id="text">姓名:张二蛋年龄:29地址:北京海淀区</textarea><br/>  
        <button onclick="writeData()">写入</button>  
        <button onclick="readData()">读取</button><br/>  
        读取的内容:  
        <div id="content"></div>  
    </body>  
</html>

123 回复

经过一天的测试,发现楼主提供的代码不怎么严谨,而且也没有再启动时增加是否支持nfc的判断定: 1。增加判断的代码: var nfcAdapter = NfcAdapter.getDefaultAdapter(main);
if(nfcAdapter == null){ alert(“设备不支持NFC!”); return; } if (!nfcAdapter.isEnabled()) { alert(“请在系统设置中先启用NFC功能!”); return; }
2、对于数据处理时用的一些id其实可以用android原生的变量: intent.getParcelableArrayExtra(“android.nfc.extra.NDEF_MESSAGES”);中"android.nfc.extra.NDEF_MESSAGES" == NfcAdapter.EXTRA_NDEF_MESSAGES 这样就和android原生代码一致了,比较好理解。NfcAdapter是啥看看代码头部的调用赋值就应该能明白吧。


在webview方式集成中,“android.nfc.action.TECH_DISCOVERED” == intent.getAction() 该条件不成立,intent.getAction() 获取到的一直是 android.intent.action.MAIN ,求帮助

records = rawmsgs[0].getRecords(); 读IC卡这句时报错,过不去,加try catch提示TypeError: Cannot read property ‘0’ of null’

那应该是var rawmsgs = intent.getParcelableArrayExtra(“android.nfc.extra.NDEF_MESSAGES”); 这里没有得到数据,还请查一下资料ic卡的数据如何保存,保存在什么字段中。

评论1楼 ,这个无法获取到,你说的查一下资料ic卡数据,在哪里查?现在解决问题没有?官方提供的这个方法 intent.getParcelableArrayExtra()根本没用;而且看大部分的资料过这个字段是没有问题的"android.nfc.extra.NDEF_MESSAGES"。如果解决了请回复我一下, var rawmsgs = intent.getParcelableArrayExtra(“android.nfc.extra.NDEF_MESSAGES”);

回复 Android_磊子:var rawmsgs = intent.getParcelableArrayExtra("android.nfc.extra.NDEF_MESSA这个方法获得的是null,无法继续往下读取怎么办?

@862805551@qq.com:问题解决了么

是啊,没有东西,显示是NULL

回复 k***@163.com:请问这个问题解决了吗?我遇到同样问题,过不去了。

回复 7R4ATMqQPOPKjR: 哥们nfc读卡问题实现了吗?有偿求助实现同样的功能。

回复 g***@163.com: 兄弟 这个问题解决了么?

回复 Android_磊子: 如果不写入,直接读,为什么只显示请勿移开标签正在读取数据

回复 1***@163.com: 回复 1***@163.com: 同问

回复 g***@163.com: 可以读卡片ID了

回复 1***@qq.com: 我的var rawmsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); 这句也是null,请问你解决了么

回复 1***@qq.com: http://ask.dcloud.net.cn/article/35046 ,这个demo是不是无法读取加密的扇区内容呀

无法读取加密的扇区内容。。。

加密扇区内容是怎么个意思,是读出来的二进制内容还需要解密?

大哥,请问下你的加密扇区的内容能读出来了吗,交流一下

如何把url写入nfc标签

兄弟,你实现NFC写入了吗?

回复 大海的凡夫俗子: 哥们nfc读卡问题实现了吗?有偿求助实现读卡功能。

回复 g***@163.com: 如何,这个好像没法直接读卡,要写入才可以

多次读取nfc信息时,监听事件newintent触发的次数为啥会逐次增加呢?有人遇到这个问题吗

这个问题是我把监听事件写在了onShow里,写onLoad里就好了

请问一下,把你这份代码复制过来就可以进行测试吗?

是的,有什么问题可以提问。

我试了下,官方给的例子确实很好用,正好解决了我好长时间都在头疼的nfc读写问题

enableForegroundDispatch; java.lang.SecurityException: NFC permission required: Neither user 10214 nor current process has android.permission.NFC. at index.html:59
------刷不出来,怎么会报这个错呢?

没有加入权限。 1,云打包时,在mainifest.json试图|模块权限配置,勾选权限,重新云打包 2,离线打包,自行在AndroidManifest.json中配置好。

权限是否只有android.premission.NFC这个勾选上,还是除了这个还有其他需要勾选的呢?

为什么勾选了这个权限,真机联调的时候应用启动的时候还是会报这个错误呢?手机是三星s5移动定制版

回复 启动错误:重新打包了吗

回复 Android_磊子:真机联调在读取NFC标签的时候应用会闪退,重新打包后还是会提示这个错误,似乎是抛出的异常项。。。

回复 启动错误:确认勾选此权限并云打包了的话吧,把你的apk发给我看看 QQ609029981

function __read(intent) { try { waiting.setTitle(‘请勿移开标签\n正在读取数据…’); var Parcelable = plus.android.importClass(“android.os.Parcelable”); console.log(Parcelable); var rawmsgs = intent.getParcelableArrayExtra(“android.nfc.extra.NDEF_MESSAGES”) console.log(rawmsgs); records = rawmsgs[0].getRecords(); 用来读取银行卡和公交卡的时候,运行到上面这一句话直接报错:‘ TypeError: Cannot read property ‘0’ of null’
var result = records[0].getPayload();
var s = plus.android.newObject(“java.lang.String”, result);
document.getElementById(‘content’).textContent = s;
waiting.close();
} catch (e) {
console.log(e);
waiting.close();
}
}

我也遇到同样的问题,一直没搞定,求大神。。

回复 s***@126.com:同问啊,你解决了么?

我也这个问题,你读IC卡正常吗?

启动时,提示“enableForegroundDispatch;java.lang.reflect.InvocationTargetException”什么原因呢,把这段代码注释掉,没有反应

enableForegroundDispatch;java.lang.reflect.InvocationTargetException 的报错是什么问题呢

这是手机不支持nfc功能

请问我创建一个java web 项目,新建一个html网页,在手机端使用浏览器访问这个页面,不能达到效果。请问是不是还需要一些配置?

求助一下,我把这段代码打了个包测试NFC读取,但是我一读取成功后就跳转到手机主页了,另外一个问题,我手机上有多个NFC读取APP的话,如何设置读取这个NFC读取的时候回自动调用我指定的app或者app内的指定页面? 希望大家能帮助一下

在webview方式集成中,“android.nfc.action.TECH_DISCOVERED” == intent.getAction() 该条件不成立,intent.getAction() 获取到的一直是 android.intent.action.MAIN ,求帮助

原生的Tag类有getId();这个方法可以得到NFC芯片的id,用这个怎么得到NFC的id,在线等,急。。。。。。。。

怎么读取到tag的id ?求助

@DCloud_Android_磊子:
techListsArray有错误,应该为: var techListsArray = [ [“android.nfc.tech.IsoDep”], [“android.nfc.tech.NfcA”], [“android.nfc.tech.NfcB”], [“android.nfc.tech.NfcF”], [“android.nfc.tech.Ndef”], [“android.nfc.tech.NfcV”], [“android.nfc.tech.NdefFormatable”], [“android.nfc.tech.MifareClassic”], [“android.nfc.tech.MifareUltralight”] ];
还有,我扫描北京公交卡没有成功,在__read(intent)方法中 var rawmsgs = intent.getParcelableArrayExtra(“android.nfc.extra.NDEF_MESSAGES”); rawmsgs为null,怎么解决?

@DCloud_Android_磊子: @DCloud_SDK_骁骑:
解决了一部分,但是又有个地方卡住了。
为什么plus.android.importClass(“android.nfc.tech.MifareClassic”);不成功呢? 执行上面一句后,再调用MifareClassic报错。。

看源码知道是有构造方法的:


原因找到了:是由于代码中添加了/* @hide /,Google官方给出的结果是,允许内部调用,不允许外部调用。这个问题怎么解决?

楼主解决问题没有

我复制改代码,打包app,运行没有任何反应。就是没有读取的动作。设备有声音,就是没有读取的信息

是不是一般的nfc白卡都可以用你们写的实例,需要买什么样的nfc卡

我之前也是这样,打包是没有加上NFC 权限。manifest.json 文件,在“代码视图”中权限行手工加入"permissions": ["<uses-permission android:name=“android.permission.NFC” />",

直接复制楼主的代码运行,当把卡贴近手机时会闪退,… 安卓7.0@DCloud_Android_磊子

试了北京公交卡和提供的标签卡都是运行到这行出问题 var rawmsgs = intent.getParcelableArrayExtra(“android.nfc.extra.NDEF_MESSAGES”); rawmsgs是个null,这个如何处理 @DCloud_Android_磊子

解决了,得先写一下就可以读出来了

回复 煮酒吃豆豆:请问上面的代码可以读出北京公交卡么,我试了下有报错

好像不行,写不了

回复 煮酒吃豆豆: 我的卡里有信息,不用写现在要读出来

回复 1***@qq.com: nfc读卡问题实现了吗?有偿求助实现同样的功能。

回复 1***@qq.com: 请问解决了吗?

回复 g***@163.com: 可以了

回复 1***@qq.com: 读卡id可以实现了

回复 1***@qq.com: 电子标签有密钥,怎么识别呀

感谢楼主的分享,可以正常读取标签数据。在真机运行中也可以读写数据。现在想利用手机读NFC标签ID验证身份。 现在无法解析id: var tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); var Ndef = plus.android.importClass(‘android.nfc.tech.Ndef’); console.log(tag.getId()); 错误信息: Uncaught TypeError: tag.getId is not a function at index.html:162
如果直接读取id: var tag = intent.getParcelableExtra(NfcAdapter.EXTRA_ID); console.log(tag); 信息如下: null at index.html:162
无法读出id,

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> <title></title> <script> var NfcAdapter; var NdefRecord; var NdefMessage; 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); 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.MifareClassi"], ["android.nfc.tech.MifareUltralight"] ]; document.addEventListener("newintent", function() { console.error('newintent'); // setTimeout(handle_nfc_data1, 1000); handle_nfc_data1(); }, false); document.addEventListener("pause", function(e) { if (nfcAdapter) { nfcAdapter.disableForegroundDispatch(main); console.log('pause'); } }, false); document.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); } }

// if(readyWriteData){ // write(intent); // readyWriteData = false; // }else if(readyRead){ // read(intent); // readyRead = false; // } } } function showToast(msg){ plus.nativeUI.toast(msg); }

// waiting.setTitle(‘请勿移开标签\n正在读取数据…’); //showToast(“111”); var Parcelable = plus.android.importClass(“android.os.Parcelable”); //showToast(“222”); var rawmsgs = intent.getParcelableArrayExtra(“android.nfc.extra.NDEF_MESSAGES”); records = rawmsgs[0].getRecords(); var result = records[0].getPayload(); var s = plus.android.newObject(“java.lang.String”,result); document.getElementById(‘content’).textContent = document.getElementById(‘content’).textContent+’|’+s; //手机终端编码 console.log(plus.device.imei); // console.info(plus.device.uuid); // 读取ID var tagid = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID); console.log(ByteArrayToHexString(tagid));

// waiting.close(); } document.addEventListener(‘plusready’,listenNFCStatus,false);

**以上代码是在楼主代码基础做的微调

运行显示数据如下: newintent at index.html:39 resume at index.html:51 action type:android.nfc.action.TECH_DISCOVERED at index.html:67 990004774535110,356760060444444 at index.html:171 here at index.html:148 04BA59423C4D80 at index.html:179 pause at index.html:46

以上可以读取nfc卡号,读取出手机IMEI设备编号,可以将2者加密传输到后台,就可以在绑定手机终端的基础上,实现用户读卡认证(网络传输和加密请自行处理)。

楼主您好,非常感谢你的NFC代码分享,现在遇到这种情况,在真机调度下运行时,读NFC内容正常,但生成发布包后去正式安装读NFC时就出现闪退,请求楼主帮助。

在清单文件上面加上NFC的权限,如果不加权限,直接运行可以,但是打包会报缺少权限

不支持iOS版本的nfc吗? @DCloud_Android_磊子

请问ios的NFC有吗

获取NFC的ID bytesId = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID); console.log(ByteArrayToHexString(bytesId)); 下面是字节流转16进制的函数,将网上JAVA的代码改成JS,谢谢原作者(我也不知道作者是谁)
function ByteArrayToHexString(inarray) { // converts byte arrays to string
var i, j, inn;
hex = [“0”, “1”, “2”, “3”, “4”, “5”, “6”, “7”, “8”, “9”, “A”, “B”, “C”, “D”, “E”, “F”];
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;  
    }  

亲自测试成功的!

我的vue框架里面需要调手机的nfc识别卡内的信息, 一直不知道哪里出问题了

var rawmsgs = intent.getParcelableArrayExtra(“android.nfc.extra.NDEF_MESSAGES”); 读完 rawmsgs 是 null 有人能解决吗

我碰到了同样的问题,哥们nfc读卡问题实现了吗?有偿求助实现同样的功能。

回复 g***@163.com: 我也遇到了这个问题,你解决了吗

怎么限制一下仅在本应用中响应NFC 不跳转到系统自带的NFC应用呢,谢谢

你系统没有授权才会这样吧

恩恩 是的用的安卓离线打的包忘记给授权了,谢谢

@Android_磊子 这个H5的实现方式,是否可以直接读,不需要先写入;如果是直接读的话能成功吗?我这边报错跟他们一样,在var rawmsgs = intent.getParcelableArrayExtra(“android.nfc.extra.NDEF_MESSAGES”); 这个地方报空指针异常,有什么解决方案吗

var rawmsgs = intent.getParcelableArrayExtra(“android.nfc.extra.NDEF_MESSAGES”);这句代码是针对NDEF格式的数据有效。你的NFC标签可能不是NDEF(比如是NcfA、IsoDep或其他的)。我也不是百分之百确定,只是估计。

回复 l***@live.com: 这个问题我也有 是要先了解nfc是什么格式的数据才能使用对应的方法去处理吗?

想问一下,我用var tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);这行代码想要获取我要读的卡的标签类型,但是我打印了一下是{“UUID”:“Invocation405839258”,“TYPE”:“JSBObject”,“className”:“android.net.wifi.ScanResult”}这种信息,这样的话,type这一列是JSBObeject,NFC标签应该没有这种类型吧,这样我是该读哪个类型标签的数据呢?

Native.js 获取到的安卓对象都是封装成这个样子的,主要看className,把相应的className用plus.android.importClass引入进来就可以了

请问一下,这个程序,我返回桌面之后,再刷卡,怎么让他进入系统的那个候选列表呢,求解答,不胜感激!!!!

解决rawmsgs为null的问题:
var rawmsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);

改成NfcAdapter.EXTRA_NDEF_MESSAGES 依然还是null是因为啥呢

回复 1***@163.com: 请问 你这个问题解决了吗? 我也遇到了

回复 小小段:我也遇到了,你们解决了吗

无法触发newintent事件,只接同时触发pause和resume 事件是怎么回事,应该如何修改??? 报错信息及输出信息如下: pause at plus/zhh_nfc.html:44 18:02:58.584 resume at plus/zhh_nfc.html:49 18:04:00.871 Uncaught java.lang.IllegalStateException: You must disable foreground dispatching while your activity is still resumed;at android.nfc.NfcAdapter.disableForegroundDispatch at plus/zhh_nfc.html:1

你解决了吗?我读取成功。 问个小问题。加下我QQ512951614

回复 2***@qq.com: NFC读写标签数据,在var rawmsgs = intent.getParcelableArrayExtra(“android.nfc.extra.NDEF_MESSAGES”); 这个地方报空指针异常,你是怎么解决的呀

[ERROR] java.lang.SecurityException: NFC permission required: Neither user 10235 nor current process has android.permission.NFC.;at android.nfc.NfcAdapter.enableForegroundDispatch at pages/nfc/nfc.vue:64 配置了权限,一直提示没得权限?重新打包自定义基座测试,一直提示这个。删除本地基座,后面重新打包又可以了。
但随后,uniapp下,又出现[ERROR] TypeError: Cannot read property ‘addEventListener’ of undefined at pages/nfc/nfc.vue:84 uniapp下怎么使用监听呢?

uniapp 用onShow和onHide

回复 吃辣条的大妖怪: 感谢提醒,总算在uniapp下把老子的公交卡,门禁卡读出数据了。 卡片ID等数据给其他设备读出数据一致。

回复 lyle: uniapp中怎么实现读取nfc卡信息呢,可以提供一下代码吗?不胜感激

我在读取身份证时,怎么读出来的不是身份信息,而是一串字节数组ID呢

看起来很厉害,可以给讲解一下吗

@Android_磊子 你好,请问下MifareClassic格式标签和 NDEF格式标签加密的怎么处理啊?就是读写加密的NFC标签,用现在的程序,总是提示“格式化tag失败”,帮忙看下呢,不胜感激

查看下安卓sdk https://www.androiddoc.com/reference/android/nfc/tech/MifareClassic.html#authenticateSectorWithKeyB(int, byte[]) 需要用到 揭秘函数 authenticateSectorWithKeyA (int sectorIndex, byte[] key) authenticateSectorWithKeyB (int sectorIndex, byte[] key)

回复 m***@163.com: 嗯 谢谢啦,已经解决了

你好,请问加密是怎么实现的?

uniapp可以使用 plus.globalEvent.addEventListener(‘newintent’, ()=>{
}); 监听newintent事件了
https://uniapp.dcloud.io/use-html5plus

Uncaught Attempt to invoke virtual method ‘java.lang.Class java.lang.reflect.Method.getReturnType()’ on a null object reference;at android.nfc.tech.MifareClassic.authenticateSectorWithKeyA 请问一下这个是什么问题?如何解决!

我遇到了同样的问题。请问解决了吗??

我也遇到同样类似的问题 Uncaught Attempt to invoke virtual method ‘java.lang.Class java.lang.reflect.Method.getReturnType()’ on a null object reference;at android.nfc.tech.MifareClassic.writeBlock at wrnfc.html:1

var NfcAdapter; var NdefRecord; var NdefMessage; var waiting; var readyRead = false; var nfcAdapter, main, pendingIntent, intentFiltersArray, techListsArray, IntentFilter; export default { data() { return { currentNFCInfo: [], //NFC 读取消息; bannerShow: false, remark: ‘’, message: ‘’, count: 0, timestampHide: ‘’, timestampShow: ‘’ }; }, onLoad() { this.listenNFCStatus(); }, methods: { listenNFCStatus() { try { console.log(‘Init NFC…’); 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’); IntentFilter = plus.android.importClass(‘android.content.IntentFilter’); NfcAdapter = plus.android.importClass(‘android.nfc.NfcAdapter’); nfcAdapter = NfcAdapter.getDefaultAdapter(main); var intent = new Intent(main, main.getClass()); intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); pendingIntent = PendingIntent.getActivity(main, 0, intent, 0); var ndef = new IntentFilter(‘android.nfc.action.TECH_DISCOVERED’); ndef.addDataType(’/’); intentFiltersArray = [ndef]; techListsArray = [ [‘android.nfc.tech.IsoDep’], [‘android.nfc.tech.NfcA’], [‘android.nfc.tech.NfcB’], [‘android.nfc.tech.NfcF’], [‘android.nfc.tech.Ndef’], [‘android.nfc.tech.NfcV’], [‘android.nfc.tech.NdefFormatable’], [‘android.nfc.tech.MifareClassic’], [‘android.nfc.tech.MifareUltralight’] ]; } catch (e) { console.error(e); } }, handle_nfc_data() { NdefRecord = plus.android.importClass(‘android.nfc.NdefRecord’); NdefMessage = plus.android.importClass(‘android.nfc.NdefMessage’); main = plus.android.runtimeMainActivity(); var intent = main.getIntent(); console.log(‘action type:’ + intent.getAction()); if (‘android.nfc.action.TECH_DISCOVERED’ == intent.getAction()) { if (readyRead) { this.read(intent); readyRead = false; } } else { console.log(‘nfc读取失败’); } }, read(intent) { try { var content = ‘’; waiting = plus.nativeUI.showWaiting(‘请将NFC标签靠近!’); waiting.setTitle(‘请勿移开标签\n正在读取数据…’); var tag = plus.android.importClass(‘android.nfc.Tag’); waiting.close(); var Parcelable = plus.android.importClass(‘android.os.Parcelable’); var rawmsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if (rawmsgs != null && rawmsgs.length > 0) {
waiting.close();
var records = rawmsgs[0].getRecords();
var result = records[0].getPayload();
if (result != null) {
var s = plus.android.newObject(‘java.lang.String’, result);
console.log(s);
this.currentNFCInfo = s;
} else {
this.currentNFCInfo = ‘’;
}
} else {
console.log(‘NFC获取失败’);
uni.showToast({
title: ‘NFC获取失败.’,
icon: ‘none’
});
}
} catch (e) {
handle_nfc_data.log(e);
console.log(‘NFC获取失败,丢出异常’);
waiting.close();
uni.showToast({
title: ‘NFC获取失败,丢出异常.’,
icon: ‘none’
})
}
}
}
};
大神们,这是我的原码,我直接调用handle_nfc_data之后,程序跑到var intent = main.getIntent();这句代码的时候,打印出来intent为null,大神们,该怎么解决,求打救,谢谢!

var intent = main.getIntent();
console.log(“action type:” + intent.getAction());
intent 对象为空,怎么解决,有没有人遇到过?

var rawmsgs = intent.getParcelableArrayExtra(“android.nfc.extra.NDEF_MESSAGES”); 返回null 有经历过的大佬指导一下

请问大神我直接用你这个个demo测试,是不是必须先写入再读取;还有就是写入的时候提示格式tag错误要怎么解决啊

你好,你写的这个怎么让app进入系统候选列表

请问,能读取身份证吗?

java.io.IOException;at android.nfc.tech.Ndef.connect 写入NFC标签的时候报这个错,有没有遇到过的同学

大佬解决了吗 我也遇到了

在uni-app中实现NFC读写标签数据的功能,需要结合H5+ API(即5+ App API)来完成,因为NFC功能通常不属于纯Web API的一部分,而是需要依赖于原生应用的能力。以下是一个基本的示例代码,展示了如何在uni-app中读取和写入NFC标签数据。

1. 配置manifest.json

首先,确保在manifest.json中启用了NFC权限:

"plus": {
    "distribute": {
        "android": {
            "permissions": [
                "NFC"
            ]
        }
    }
}

2. 读取NFC标签数据

在页面的JavaScript代码中,添加NFC读取逻辑:

// 引入NFC模块
const nfc = plus.nfc;

// 注册NFC适配器状态变化事件监听器
nfc.addEventListener('statechange', function(e) {
    if (e.newState === 'on') {
        console.log('NFC已启用');
        // 开始扫描NFC标签
        nfc.startNfc(function(event) {
            if (event.errMsg === 'ok') {
                // 监听标签发现事件
                nfc.addEventListener('ndef', function(ndefEvent) {
                    console.log('NFC标签数据:', ndefEvent.ndefMessage);
                    // 处理读取到的NFC标签数据
                });
            } else {
                console.error('NFC启动失败:', event.errMsg);
            }
        });
    } else {
        console.log('NFC已禁用');
    }
});

// 检查NFC适配器状态
nfc.getNfcAdapterState(function(event) {
    if (event.state === 'on') {
        console.log('NFC当前状态: 已启用');
    } else {
        console.log('NFC当前状态: 未启用');
    }
});

3. 写入NFC标签数据(示例)

写入NFC标签数据通常依赖于特定的标签格式和写权限。以下是一个简单的示例,但请注意,不是所有NFC标签都支持写入操作,且写入操作可能因设备和标签类型而异。

// 假设我们已经有一个NFC标签ID和要写入的数据
const tagId = 'some-nfc-tag-id'; // 替换为实际的标签ID
const ndefMessage = [
    {
        tnf: 1,
        type: [0x54, 0x02], // NDEF记录类型:T(Text)
        id: [],
        payload: new TextEncoder().encode('Hello, NFC!')
    }
];

// 写入NFC标签数据(注意:此方法可能需要根据实际设备调整)
function writeNfcTag(id, message) {
    // 此处应实现具体的写入逻辑,可能需要调用原生插件或API
    console.log('写入NFC标签数据:', id, message);
}

// 调用写入函数(示例)
writeNfcTag(tagId, ndefMessage);

注意:上述写入NFC标签数据的代码仅为示例,实际开发中可能需要使用特定的原生插件或API来实现写入功能,因为标准的Web API并不支持NFC写入操作。开发者需要根据具体需求和设备支持情况选择合适的方法。

回到顶部