为什么数据传输在NFC与HCE只工作与Android低12?



我试图在两个Android设备之间发送数据(为了保持简单,首先只是一个NDEF文本消息)与一个React Native应用程序。为了做到这一点,我在一个设备上模拟一个NFC标签与react-native-hce库,并在另一个设备上读取这个标签与react-native-nfc-manager库。

以下是nfc相关代码:

async function sendData() { 
const tag = new NFCTagType4({
type: NFCTagType4NDEFContentType.Text,
content: 'Hello World',
writable: true
});
session = await HCESession.getInstance();
session.setApplication(tag);
await session.setEnabled(true).catch((err) => console.log(err));
}
async function stopSending() {
if(session)
await session.setEnabled(false)
}
async function readNdef() {
stopSending()
NfcManager.requestTechnology(NfcTech.Ndef)
.then(() => NfcManager.getTag())
.then(tag => {
if(tag) {
let text = String.fromCharCode(...tag.ndefMessage[0].payload)
Alert.alert("Message received", text)
}
})
.catch(err => {
console.warn(err)
})
.then(() => {NfcManager.cancelTechnologyRequest()})
}

我在几个设备上测试了我的应用程序:

旧索尼Xperia (Android 8),三星Galaxy A50 (Android 11),华为P30 Lite (Android 11):

摩托罗拉Edge 30 Fusion (Android 12),三星Galaxy A41 (Android 12):不工作。HCE只是不工作(没有任何错误)和读取模拟标签基本上工作,,但没有读取NDEF消息,尽管它存在(应用程序TagInfo也能够读取NDEF)。对于正常的,非模拟的标签,它工作得很好。

Android 12似乎在读取模拟标签和HCE方面存在问题。也许这是React原生库的问题?有人有解决这个问题的办法吗?

可能与https://stackoverflow.com/a/75676725/2373819中的答案有关,似乎Type 4 NFC规范不清楚,因为它应该是Ndef消息的最大大小。

我认为很多以前的代码使用FFFE作为最大尺寸时,实际上根据规格的最大尺寸是80FE,现在Android可能正在处理一个无效的最大尺寸的能力容器为坏。

这是一个理论,因为我没有办法测试它(我没有访问Android 12或更高版本的设备)

根据规范,实际限制是80FE,但似乎7FFF(或32K)是一个更合乎逻辑的限制,这与更可能用于物理标签的内存大小的数字相匹配,并且注释显示了一些成功。

然后是

byte[] controlTlv = BinaryUtils.HexStringToByteArray("0406E104FFFE00" + (prefManager.getWritable() ? "00":"FF"));

在库中应该是

byte[] controlTlv = BinaryUtils.HexStringToByteArray("0406E10480FE00" + (prefManager.getWritable() ? "00":"FF"));

(在同一文件中的public final byte[] ndefDataBuffer = new byte[0xFFFE];行也应该有相同的大小变化)

这个

库有问题

相关内容

  • 没有找到相关文章

最新更新