我已经成功将信息写入我的nfc卡,但现在它不再工作了,这是我的代码:
public void writeTag(MifareUltralight mifareUlTag) {
try {
mifareUlTag.connect();
String val=getRandomString();
// mifareUlTag.writePage(4, "rfa".getBytes(Charset.forName("US-ASCII")));
// mifareUlTag.writePage(5, "nfc".getBytes(Charset.forName("US-ASCII")));
mifareUlTag.writePage(10, val.getBytes(Charset.forName("US-ASCII")));
//mifareUlTag.writePage(7, " now".getBytes(Charset.forName("US-ASCII")));
} catch (IOException e) {
Log.e(TAG, "IOException while writing MifareUltralight...", e);
} finally {
try {
mifareUlTag.close();
} catch (IOException e) {
Log.e(TAG, "IOException while closing MifareUltralight...", e);
}
}
}
发生的错误是:
android.nfc.TagLostException: Tag was lost
getRandomString
方法是一个返回 3 个字符的随机字符串的函数。
我的卡又可以使用了,因为我可以读取他的号码。
我发现,对于真正的用户来说,在执行除读取 Ndef 数据以外的任何操作时,尤其是尝试写入数据时,很容易获得
TagLostException
或 IOException
与 enableForegroundDispatch
。
原因很简单,使用
enableForegroundDispatch
你无法控制通知声音。
用户过早地听到并从 RF 场中移除标签,当系统 NFC 应用程序检测到标签时,会产生声音,然后必须制作
enableForegroundDispatch
,暂停并恢复您的应用程序才能正常工作。能够交付该 Intent
,您的应用程序必须处理该 Intent
,然后开始写入标签。我发现使用Intent
更可靠,您可以关闭系统应用程序通知声音,并在完成写入标签后发出自己的声音。
enableReaderMode
也不会暂停和恢复您的应用程序,而是在新线程中处理标签读取,这通常开销较小且速度更快,从而导致出现类似enableReaderMode
等错误的可能性较低当然,这些错误仍然可能会生成,您的代码必须处理这些错误,并且使用
TagLostException
,您可以生成“失败”声音来提示用户代表标签,或者像我一样对任何错误保持沉默,然后重试当标签再次出现时写入。
enableReaderMode
只是为用户提供了比
enableReaderMode
更强大、更不易混淆的交互更新:
您是否尝试过写入 4 个字符,因为发送的数据必须是 4 个字节,您可能没有发送足够的数据。