android - 如何使用android将信息写入mifare ultra light EV1 nfc卡?
问题描述
我已成功将信息写入我的 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 场移除标签,enableForegroundDispatch
当系统 NFC 应用检测到标签时会产生声音,然后它必须制作Intent
、暂停和恢复您的应用才能交付Intent
您的应用必须处理它Intent
,然后开始写入标签。
enableReaderMode
我发现在您可以关闭系统应用通知声音并在完成对标签的写入后发出自己的声音的地方使用起来更加可靠。enableReaderMode
也不会暂停和恢复您的应用程序,而是在新线程中处理标签读取,这通常会减少开销并且速度更快,因此会降低出现错误的可能性,例如TagLostException
当然,这些错误仍然可以生成,您的代码必须处理这些错误,并且enableReaderMode
您可以生成“失败”声音以提示用户表示标签,或者我确实对任何错误保持沉默,只是在标签出现时重试写入再次呈现。
enableReaderMode
只是为用户提供了比enableForegroundDispatch
更新:
您是否尝试过写入 4 个字符,因为数据发送必须是 4 个字节,您可能没有发送足够的数据。
推荐阅读
- amazon-web-services - 标记s3上spark读取的对象
- android - 参与者失去连接后,Twilio Video Android SDK 断开连接
- javascript - 将带有 ajax 的数组发送到我在 django 中的 python 函数
- string - 在Matlab中将单元格数组的部分乘以因子
- php - 每当我在 $_POST 上使用 php 变量作为索引时,即使索引存在,isset() 也不会返回 true
- linux - 如何在 Linux 中运行 Visual Studio 代码
- java - 如何在 Android 中使用 CheckBox 设置字符串
- google-cloud-platform - Stackdriver Trace 与 Google Cloud Run
- python - 熊猫:如何结合 nunique 和 sum
- db2 - 无法连接到 db2 中的远程数据库