HarmonyOS 鸿蒙Next中NdefTag如何获取容量

HarmonyOS 鸿蒙Next中NdefTag如何获取容量 在做一个nfc相关的需求,在获取NdefTag以后,我需要获取这张 NFC 卡最多能存多少字节的 NDEF 数据,但是NdefTag这个类下没有对应获取容量的方法,然后我发现NdefTag继承了TagSession类,在TagSession下有两个方法getMaxTransmitSize和getMaxSendLength方法,所以我使用

cke_5211.png

但是去读空白卡片,返回的可以发送到标签的最大数据长度是0,读正常有数据的门禁卡和公交卡直接闪退报错

cke_11486.png

求助有什么办法可以获取到这张 NFC 卡最多能存多少字节的 NDEF 数据


更多关于HarmonyOS 鸿蒙Next中NdefTag如何获取容量的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

因为标签里可能会支持多种技术类型,所以在使用getMaxTransmitSize()接口获取发送到标签的最大数据长度时,需要通过getTagInfo()获取NFC标签对象的技术类型,按需选择特定的技术类型接口。如果Tag参数值与实际调用函数不匹配,则会出现3100201错误码,具体可参考NFC标签读写开发指南

【解决方案】

更改前代码:

try {
 const tagInfo = tag.getTagInfo(want);
 hilog.info(0x0000, 'testTag', 'New Tag Info: %{public}s', JSON.stringify(tagInfo));

 if (!tagInfo?.uid) {
   hilog.error(0x0000, 'testTag', 'UID缺失,技术类型: %{public}s', tagInfo?.technology.join(','));
   return;
 }

 if (tagInfo) {
   let ndef = tag.getNdef(tagInfo)        // 获取Ndef类型
   let size = ndef.getMaxTransmitSize()   // 设备不支持Ndef时,出现报错
   hilog.info(0x0000, 'testTag', 'onNewWant size'+ JSON.stringify(size))
 }
 // 后续处理逻辑
} catch (error) {
 hilog.error(0x0000, 'testTag', '错误码: %{public}d', error.code);
}

运行后日志输出:

New Tag Info: {"uid":[205,128,99,22],"technology":[3,1,1,8,7],"extrasData":[{"HistoricalBytes":"00810000000000CD806316","HiLayerResponse":""},{"Sak":8,"Atqa":"0400"},{"Sak":8,"Atqa":"0400"},{},{}],"tagRfDiscId":2,"remoteTagService":{"type":"RemoteObject","value":{}}} 
错误码: 3100201

因为根据标准NFC-Tag文档的常量,可知当前NFC设备只支持3:ISO_DEP类型、1:NFC_A类型、8:MIFARE_CLASSIC类型和7 :NDEF_FORMATABLE类型。所以上述代码在使用getNdef()接口时会报错。

因此,更改后代码如下:

try {
  const tagInfo = tag.getTagInfo(want);
  hilog.info(0x0000, 'testTag', 'New Tag Info: %{public}s', JSON.stringify(tagInfo));

  if (!tagInfo?.uid) {
    hilog.error(0x0000, 'testTag', 'UID缺失,技术类型: %{public}s', tagInfo?.technology.join(','));
    return;
  }

  if (tagInfo) {
    let isoDep = tag.getIsoDep(tagInfo)       // 获取IsoDep类型
    let size = isoDep.getMaxTransmitSize()  // 设备支持IsoDep时,输出结果
    hilog.info(0x0000, 'testTag', 'onNewWant size'+ JSON.stringify(size))
  }
  // 后续处理逻辑
} catch (error) {
  hilog.error(0x0000, 'testTag', '错误码: %{public}d', error.code);
}

日志输出:

New Tag Info: {"uid":[205,128,99,22],"technology":[3,1,1,8,7],"extrasData":[{"HistoricalBytes":"00810000000000CD806316","HiLayerResponse":""},{"Sak":8,"Atqa":"0400"},{"Sak":8,"Atqa":"0400"},{},{}],"tagRfDiscId":2,"remoteTagService":{"type":"RemoteObject","value":{}}} 
onNewWant size:65279 

即可查询出发送到标签最大数据长度。

更多关于HarmonyOS 鸿蒙Next中NdefTag如何获取容量的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,NdefTag的容量可通过getTagSize()方法获取,返回值为标签的存储容量(单位字节)。该方法属于@ohos.nfc.tag模块,需先通过getNdefTag()获取NdefTag实例后调用。示例代码:

import { tag } from '@kit.ConnectivityKit';
let ndefTag: tag.NdefTag = tag.getNdefTag(radioTag);
let tagSize: number = ndefTag.getTagSize();

在HarmonyOS Next中,获取NFC标签的NDEF容量需要通过NdefTaggetNdefMessage()方法读取标签数据,再结合标签类型判断容量上限。TagSessiongetMaxTransmitSize()getMaxSendLength()方法主要用于通信层传输限制,并非存储容量。

对于空白卡返回0或读取有数据卡闪退的问题,可能是标签未格式化或兼容性问题。建议先调用NdefTag.format()方法格式化标签,再尝试读取。实际容量需参考NFC论坛类型规范(如NTAG213容量为144字节,NTAG215为504字节)。可通过标签的ATQA/SAK响应识别具体类型后查询规格文档。

回到顶部