首页 > 解决方案 > 如何使用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 lostgetRandomString方法是一个返回 3 个字符的随机字符串的函数。我的卡又能用了,因为我能读到他的号码。

标签: androidnfcmifare

解决方案


我发现,对于真正的用户来说,除了读取 Ndef 数据之外,特别是尝试写入数据时,很容易获得TagLostExceptionIOException使用它。enableForegroundDispatch

原因很简单,enableForegroundDispatch你不控制通知声音。

用户过早听到并从 RF 场移除标签,enableForegroundDispatch当系统 NFC 应用检测到标签时会产生声音,然后它必须制作Intent、暂停和恢复您的应用才能交付Intent您的应用必须处理它Intent,然后开始写入标签。

enableReaderMode我发现在您可以关闭系统应用通知声音并在完成对标签的写入后发出自己的声音的地方使用起来更加可靠。enableReaderMode也不会暂停和恢复您的应用程序,而是在新线程中处理标签读取,这通常会减少开销并且速度更快,因此会降低出现错误的可能性,例如TagLostException

当然,这些错误仍然可以生成,您的代码必须处理这些错误,并且enableReaderMode您可以生成“失败”声音以提示用户表示标签,或者我确实对任何错误保持沉默,只是在标签出现时重试写入再次呈现。

enableReaderMode只是为用户提供了比enableForegroundDispatch

更新:

您是否尝试过写入 4 个字符,因为数据发送必须是 4 个字节,您可能没有发送足够的数据。


推荐阅读