PhoneGap NFC跨设备传输:addMimeTypeListener触发后无法显示数据
我帮你排查了代码里的几个关键问题,应该能解决接收端无法显示传输文本的问题:
问题1:事件对象属性引用错误
你在parseTag函数里用了nfcEvent.tagData来获取NDEF记录,但PhoneGap NFC插件的事件对象结构里,NDEF消息实际是存在nfcEvent.tag.ndefMessage中的,tagData并不是正确的属性名。
问题2:MIME类型记录的Payload未处理状态字节
自定义MIME类型的NDEF记录,payload的第一个字节是状态字节(通常为0x00),直接转字符串会带上无效字符,必须跳过这个字节再进行转换。
问题3:DOM操作与通知函数的参数错误
你调用app.notifyUser(p)时传入了DOM元素,而notifyUser应该接收字符串;另外要确保页面上存在id="display"的元素,否则display.appendChild(p)会报错。
修正后的代码示例
1. 修正deviceready中的监听器注册
deviceready: function () { document.getElementById('checkbox').addEventListener('change', app.toggleCheckbox, false); sample.addEventListener('click', app.showSampleData, false); nfc.addNdefListener( function() { app.notifyUser("检测到NDEF格式标签"); }, function() { app.notifyUser("NDEF监听器注册成功"); }, function(error) { app.notifyUser("NDEF监听器注册失败: " + error); } ); // 修正addMimeTypeListener的回调与错误处理 nfc.addMimeTypeListener( "text/shunt", parseTag, function() { app.notifyUser("自定义MIME监听器注册成功"); }, function(error) { app.notifyUser("自定义MIME监听器注册失败: " + error); } ); },
2. 修正parseTag解析函数
function parseTag(nfcEvent) { // 正确获取NDEF消息数组 var ndefMessage = nfcEvent.tag.ndefMessage; // 确保display元素存在 var display = document.getElementById('display'); if (!display) { app.notifyUser("未找到display元素"); return; } // 清空之前的内容(可选) display.innerHTML = ''; for (var i = 0; i < ndefMessage.length; i++) { var record = ndefMessage[i]; // 验证是否是我们自定义的MIME类型 if (nfc.bytesToString(record.type) === "text/shunt") { // 跳过第一个状态字节,再转换为字符串 var payloadText = nfc.bytesToString(record.payload.slice(1)); var p = document.createElement('p'); p.textContent = payloadText; display.appendChild(p); // 通知用户收到的文本内容 app.notifyUser("收到传输内容: " + payloadText); } } }
3. 发送端函数补充错误处理(可选)
shareMessage: function () { var mimeType = 'text/shunt', payload = 'test', record = ndef.mimeMediaRecord(mimeType, nfc.stringToBytes(payload)); nfc.share([record], function() { app.notifyUser("NFC分享成功"); }, function(error) { app.notifyUser("NFC分享失败: " + error); } ); },
额外注意事项
- 测试时确保两台设备的NFC功能都已开启,并且以正确的贴近方式(通常是背靠背)触发传输;
- 建议将接收端APP保持在前台状态测试,避免系统后台限制;
- 确认PhoneGap NFC插件是最新版本,旧版本可能存在API兼容性问题。
内容的提问来源于stack exchange,提问作者Engineeringnoob
相关产品推荐
相关产品推荐

