HarmonyOS 鸿蒙Next中NdefTag如何获取容量
HarmonyOS 鸿蒙Next中NdefTag如何获取容量 在做一个nfc相关的需求,在获取NdefTag以后,我需要获取这张 NFC 卡最多能存多少字节的 NDEF 数据,但是NdefTag这个类下没有对应获取容量的方法,然后我发现NdefTag继承了TagSession类,在TagSession下有两个方法getMaxTransmitSize和getMaxSendLength方法,所以我使用
但是去读空白卡片,返回的可以发送到标签的最大数据长度是0,读正常有数据的门禁卡和公交卡直接闪退报错
求助有什么办法可以获取到这张 NFC 卡最多能存多少字节的 NDEF 数据
更多关于HarmonyOS 鸿蒙Next中NdefTag如何获取容量的实战教程也可以访问 https://www.itying.com/category-93-b0.html
因为标签里可能会支持多种技术类型,所以在使用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容量需要通过NdefTag
的getNdefMessage()
方法读取标签数据,再结合标签类型判断容量上限。TagSession
的getMaxTransmitSize()
和getMaxSendLength()
方法主要用于通信层传输限制,并非存储容量。
对于空白卡返回0或读取有数据卡闪退的问题,可能是标签未格式化或兼容性问题。建议先调用NdefTag.format()
方法格式化标签,再尝试读取。实际容量需参考NFC论坛类型规范(如NTAG213容量为144字节,NTAG215为504字节)。可通过标签的ATQA/SAK响应识别具体类型后查询规格文档。