You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:37:23