Java 读写NFC

Java 读写NFC,java,android,nfc,Java,Android,Nfc,我正在编写一个Android应用程序来读写标签。当我阅读一切正常时,当我尝试在nfc标记上保存数据时,标记首先读取数据并再次打开活动,如何阻止读取意图并正确保存数据 我有一个活动运行4个片段,读取代码在活动中,写入机制从片段调用。对于写入,我不会使用enableForegroundDispatch方法,它会误导用户太快地将卡移出范围,实际用户使用时会导致大量写入错误和数据损坏 这是因为声音提示发生在操作系统读取卡之后,在代码有机会写入卡之前 我会使用enableReaderMode来控制声音提示

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


我有一个活动运行4个片段,读取代码在活动中,写入机制从片段调用。对于写入,我不会使用
enableForegroundDispatch
方法,它会误导用户太快地将卡移出范围,实际用户使用时会导致大量写入错误和数据损坏

这是因为声音提示发生在操作系统读取卡之后,在代码有机会写入卡之前

我会使用
enableReaderMode
来控制声音提示

更新 注意:使用
enableDrawerMode
您仍然可以在清单中放置意图过滤器,当Android操作系统看到特定类型的标记时,它会要求启动您的应用程序。无论您在活动中如何处理卡片,从清单意图过滤器生成的意图总是在活动的
onCreate
方法中处理

另外,
enableForegroundDispatch
对于读取来说也是不可靠的,因为操作系统以类似于无窗口活动的方式处理NFC读取,所以在执行读取时,您的活动将暂停

我已经用
enableForegroundDispatch
对真实用户进行了测试,当你的应用程序在前台时,标签进入范围,你的应用程序被暂停,在你的应用程序有机会恢复之前,标签超出范围并返回范围,因此操作系统认为没有任何东西在等待来自它的意图,因此打开它自己的窗口显示NDEF数据的基本屏幕,而不是试图将意图传递给你仍然暂停的活动

另一个建议是,如果您可以轻松地使用NDEF格式,则不要使用NDEF格式,因为操作系统了解NDEF,它将尝试使用NDEF格式,使用您自己的格式意味着操作系统不太可能干扰您的操作。但是,如果您想写入多于一页的数据,那么会有更多的复杂性,但您确实可以获得更好的错误处理能力

使用
enableReaderMode
读卡时,应用程序不会暂停(而是在应用程序中的一个单独线程中处理卡交互),您可以控制声音,因此您可以在完成书写时播放声音,而不是在任务完成一半时播放声音

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

更新: 重新阅读代码时,似乎在编写代码时假设标记在范围内。因为标记可以轻松、频繁地进出或范围,所以只要启动
onNewIntent
,就可以更可靠地编写标记

您应该将
onNewIntent
视为一个通知,通知您标记在从标记读取或向标记写入的范围内(在
enableReaderMode
方法中,它被称为
onTagDiscovered
,因为它实际上就是这样的。)

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

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

这是因为声音提示发生在操作系统读取卡之后,在代码有机会写入卡之前

我会使用
enableReaderMode
来控制声音提示

更新 注意:使用
enableDrawerMode
您仍然可以在清单中放置意图过滤器,当Android操作系统看到特定类型的标记时,它会要求启动您的应用程序。无论您在活动中如何处理卡片,从清单意图过滤器生成的意图总是在活动的
onCreate
方法中处理

另外,
enableForegroundDispatch
对于读取来说也是不可靠的,因为操作系统以类似于无窗口活动的方式处理NFC读取,所以在执行读取时,您的活动将暂停

我已经用
enableForegroundDispatch
对真实用户进行了测试,当你的应用程序在前台时,标签进入范围,你的应用程序被暂停,在你的应用程序有机会恢复之前,标签超出范围并返回范围,因此操作系统认为没有任何东西在等待来自它的意图,因此打开它自己的窗口显示NDEF数据的基本屏幕,而不是试图将意图传递给你仍然暂停的活动

另一个建议是,如果您可以轻松地使用NDEF格式,则不要使用NDEF格式,因为操作系统了解NDEF,它将尝试使用NDEF格式,使用您自己的格式意味着操作系统不太可能干扰您的操作。但是,如果您想写入多于一页的数据,那么会有更多的复杂性,但您确实可以获得更好的错误处理能力

使用
enableReaderMode
读卡时,应用程序不会暂停(而是在应用程序中的一个单独线程中处理卡交互),您可以控制声音,因此您可以在完成书写时播放声音,而不是在任务完成一半时播放声音

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

更新: 重新阅读代码时,似乎在编写代码时假设标记在范围内。因为标记可以轻松、频繁地进出或范围,所以只要启动
onNewIntent
,就可以更可靠地编写标记

您应该处理
onNewIntent