Nexus S:写入MifareClassic NFC标签在不处于调试模式时失败

时间:2011-06-25 23:46:27

标签: android mifare

我有一个奇怪的问题。当我调试我的程序并在“writeBlock”命令之前设置一个断点来编写我的MifareClassic卡时,一切都很顺利。卡片写好,我的程序继续 如果我删除断点,我会得到“IO异常:收发失败”!我把断点放回去而没有改变我的代码,它再次起作用了!

我迷路了......问题是否有可能来自程序执行的速度?有一个断点会使执行更慢......

这是我的代码(在此功能之前完成身份验证):

private static boolean WriteMfcBlock(MifareClassic mfc, int blockNumber, byte[] value) {
    try {
        byte[] toWrite = new byte[MifareClassic.BLOCK_SIZE];

        //if the value is less than 16 bytes, fill it with '0'
        for (int i=0; i<MifareClassic.BLOCK_SIZE; i++) {
            if (i < value.length) toWrite[i] = value[i];
            else toWrite[i] = 0;
        }

        if (!mfc.isConnected()) mfc.connect();

        mfc.writeBlock(blockNumber, toWrite);

        //Check if the writing is well done
        byte[] read = mfc.readBlock(blockNumber);
        for (int i = 0; i < MifareClassic.BLOCK_SIZE; i++ ) {
            if (toWrite[i] != read[i]) return false;
        }

        return true;
    }
    catch (IOException e) {
        textViewInfo.setText("IO EXCEPTION");
        return false;
    }
}

感谢您的帮助 西尔

1 个答案:

答案 0 :(得分:0)

我向前迈进了一步。它似乎来自一个线程问题。 MifareClassic的“writeblock”命令必须由活动的主要过程触发。 在我的应用程序中,它是一个触发“writeblock”的按钮(实现OnClickListener)。 在调试模式下,调试线程可以隐藏此行为,因为它是主线程并使应用程序运行良好。

所以从现在开始,我所做的只是要求用户从rf字段中删除标签并将其放回原处。所以我得到了再次发现标签的意图,然后我可以毫无问题地执行“writeblock”命令。

最后,处理标签上的读写操作的最佳方法是创建2个活动,一个用于读数,一个用于写作。

如果您有任何评论或其他方式,请回答此主题。

西尔