实现NFC碰一碰功能的基础配置

manifest.json中配置NFC权限和功能声明:

{
  "app-plus": {
    "distribute": {
      "android": {
        "permissions": [
          "android.permission.NFC"
        ],
        "features": [
          {
            "name": "android.hardware.nfc",
            "required": true
          }
        ]
      }
    }
  }
}

检测设备NFC支持情况

通过uni.getSystemInfo检测设备NFC支持:

uni.getSystemInfo({
  success(res) {
    if (!res.nfcEnabled) {
      uni.showToast({ title: '设备不支持NFC', icon: 'none' });
    }
  }
});

监听NFC标签发现

在页面生命周期中注册和移除NFC监听:

onLoad() {
  this.startNfcDiscovery();
},
onUnload() {
  this.stopNfcDiscovery();
},
methods: {
  startNfcDiscovery() {
    plus.nfc.addEventListener('discovered', this.onNfcDiscovered);
    plus.nfc.startDiscovery();
  },
  stopNfcDiscovery() {
    plus.nfc.removeEventListener('discovered', this.onNfcDiscovered);
    plus.nfc.stopDiscovery();
  }
}

处理NFC标签数据

实现标签发现回调函数:

onNfcDiscovered(res) {
  const tag = res.tag;
  if (tag.techList.includes('android.nfc.tech.Ndef')) {
    const ndef = plus.android.invoke(tag, 'getTech', 'android.nfc.tech.Ndef');
    const ndefMessage = plus.android.invoke(ndef, 'getNdefMessage');
    const records = plus.android.invoke(ndefMessage, 'getRecords');
    
    // 解析NDEF记录
    for (let i = 0; i < records.length; i++) {
      const record = records[i];
      const payload = plus.android.invoke(record, 'getPayload');
      const text = String.fromCharCode.apply(null, payload);
      console.log('NFC数据:', text);
    }
  }
}

写入数据到NFC标签

创建NDEF消息并写入标签:

writeToNfcTag(text) {
  const NdefRecord = plus.android.importClass('android.nfc.NdefRecord');
  const NdefMessage = plus.android.importClass('android.nfc.NdefMessage');
  
  // 创建文本类型的NDEF记录
  const textBytes = Array.from(text).map(c => c.charCodeAt(0));
  const textRecord = new NdefRecord(
    0x01,  // TNF_WELL_KNOWN
    0x02,  // RTD_TEXT
    new ArrayBuffer(0),
    textBytes
  );
  
  // 创建NDEF消息
  const ndefMessage = new NdefMessage([textRecord]);
  
  // 写入标签
  plus.nfc.writeNdefMessage(ndefMessage, () => {
    uni.showToast({ title: '写入成功', icon: 'success' });
  }, (err) => {
    uni.showToast({ title: `写入失败: ${err}`, icon: 'none' });
  });
}

Android权限动态申请

在需要时动态请求NFC权限:

requestNfcPermission() {
  const main = plus.android.runtimeMainActivity();
  const Permission = plus.android.importClass('android.Manifest$permission');
  const ActivityCompat = plus.android.importClass('androidx.core.app.ActivityCompat');
  
  if (ActivityCompat.checkSelfPermission(main, Permission.NFC) !== 0) {
    ActivityCompat.requestPermissions(main, [Permission.NFC], 1001);
  }
}

注意事项

NFC功能需要真机测试,部分Android机型需要开启NFC开关。写入操作时需保持标签与设备接触直到完成。iOS系统对NFC功能有严格限制,仅支持特定场景的NFC读取。

NDEF消息格式遵循NFC论坛标准,支持文本、URI、智能海报等数据类型。写入前应检查标签是否可写,避免对只读标签进行操作。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐