gpt4 book ai didi

android - 在 Android 上持续检测 NFC 标签

转载 作者:行者123 更新时间:2023-12-04 02:03:26 25 4
gpt4 key购买 nike

根据我的阅读和实验,我发现 Android 设备使用某种方法来防止重复读取标签 (as discussed here)。这对节能很有好处,但限制了该技术的可能应用。

例如我面临的问题是,我有一个内容不断更新的被动标签。一旦标签被读取,手机就会停止检测标签,直到它被移除,在此期间,如果不将其从字段中移除并重新点击,您将无法继续读取标签中的更新内容。此外,在标签最初被读取后,磁场要么被关闭至极弱以节省电力。因此,您不能持续为无源设备供电。

有没有办法强制 Android 设备持续供电并读取更新的被动标签?

注意:我不介意这是否涉及对 Android 设备进行 root 以实现对硬件的直接控制。

最佳答案

您在问题中所说的对于 Android NFC 设备来说根本不正确。一旦检测到标签(= 响应所有强制性命令的有效标签,并可能被分派(dispatch)到应用程序),NFC 阅读器将持续为标签供电(HF 载波保持开启)并与其交换一些命令。在该保活阶段(“存在性检查”)交换的命令取决于标签类型、Android 版本和 Android NFC 堆栈实现。这通常是

  1. 重复停用和重新激活循环,​​
  2. 反复读取某个内存区域,或
  3. 其他一些乒乓命令序列

这允许 NFC 堆栈查明标签是否仍然响应。仅当存在检查失败时,Android 才会关闭 NFC 阅读器的 HF 载波,并以完整轮询序列(测试所有支持的标签技术)或感应阶段(短 HF 载波脉冲到检测表明可能存在标签的失谐)。

因此,如果您的代码行为正常,并且您的用户设法将标签附加到 Android 设备的时间更长,则没有什么可以阻止您从同一标签读取新数据(在持续附加的情况下)多次。只要您想访问标签和标签读取 Activity ,您只需确保保留标签句柄(Tag 对象,甚至是从该标签句柄实例化的特定标签技术对象)的应用程序需要持续保持在前台。

例如,您可以执行类似的操作来从标签中读取不断更新的 NDEF 消息(请注意,您最好使用 AsyncTask (或类似的)而不是简单地生成线程并且您可能想要实现一些机制来中断线程):

new Thread(new Runnable() {
public void run() {
Ndef ndef = Ndef.get(tag);

try {
while (true) {
try {
Thread.sleep(30000);

ndef.connect();
NdefMessage msg = ndef.getNdefMessage();

// TODO: do something

} catch (IOException e) {
// if the tag is gone we might want to end the thread:
break;
} finally {
try {
ndef.close();
} catch (Exception e) {}
}
}
} catch (InterruptedException e) {
}
}
}).start();

关于android - 在 Android 上持续检测 NFC 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37045486/

25 4 0