读取和写入 NFC

Reading and writing to NFC

我正在编写一个 Android 应用程序来读取和写入标签。当我阅读一切正常时,当我尝试在 nfc 标签上保存数据时,标签首先读取数据并再次打开 activity,如何阻止从 intent 读取并正确保存数据?

我有一个运行 4 个片段的 activity,读取代码在 activity 中,写入机制从片段中调用

对于写入我不会使用enableForegroundDispatch方法,它误导用户将卡移出范围太快,导致实际用户使用时出现大量写入错误和数据损坏。

这是因为声音提示是在 OS 读卡之后,您的代码还没有机会写入它之前直接发生的。

我会使用 enableReaderMode 而不是您可以控制声音提示的地方。

更新 注意 enabledReaderMode 你仍然可以在你的清单中放置 Intent 过滤器,当它看到某种类型的标签时要求 Android OS 启动你的应用程序,从 Manifest Intent 过滤器生成的 Intent 总是在 Activity 的 onCreate 方法中处理,无论您如何处理 Activity.

中的卡片

另外 enableForegroundDispatch 对读取也不可靠,因为 OS 处理 NFC 读取的方式看起来像 windowless Activity,你的 Activity 将在读取时暂停。

我已经通过真实用户测试 enableForegroundDispatch 当您的应用程序处于前台时,标签进入范围,您的应用程序被暂停,标签超出范围并返回范围之前您的应用程序有机会恢复,因此 OS 认为没有任何东西在等待它的 Intent,因此打开它自己的 window 显示 NDEF 数据的基本屏幕,而不是尝试通过Intent to your still paused Activity.

另一个建议是不要使用 NDEF 格式,如果你能轻松做到的话,因为 OS 理解 NDEF,它会尝试用它做事,使用你自己的格式意味着 OS 是不太可能干扰您正在做的事情。但是,如果您想写入多于一页的数据,情况会更复杂,但您确实可以获得更好的错误处理能力。

有了 enableReaderMode 你的应用程序在读取卡片时不会暂停(卡片交互是在应用程序的单独线程中处理的),你可以控制声音,所以你可以播放当您完成写作而不是任务完成一半时发出声音。

答案中的低级阅读示例enableReaderMode 写作页面在结构上与阅读没有太大区别。

更新: 重新阅读您的代码,似乎在您编写时假设标签在范围内。因为标签可以轻松频繁地进出或范围,所以一旦 onNewIntent 被触发就写入更加可靠。

您应该将 onNewIntent 视为标签在范围内的通知,您可以读取或写入 from/to 标签(在 enableReaderMode 方法中它被称为 onTagDiscovered 因为事实就是如此。)

更新: 添加了一个流程图,说明我如何处理 read/write 逻辑以实现可靠的写作。