我有一个奇怪的问题。当我调试我的程序并在“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;
}
}
感谢您的帮助 西尔
答案 0 :(得分:0)
我向前迈进了一步。它似乎来自一个线程问题。 MifareClassic的“writeblock”命令必须由活动的主要过程触发。 在我的应用程序中,它是一个触发“writeblock”的按钮(实现OnClickListener)。 在调试模式下,调试线程可以隐藏此行为,因为它是主线程并使应用程序运行良好。
所以从现在开始,我所做的只是要求用户从rf字段中删除标签并将其放回原处。所以我得到了再次发现标签的意图,然后我可以毫无问题地执行“writeblock”命令。
最后,处理标签上的读写操作的最佳方法是创建2个活动,一个用于读数,一个用于写作。
如果您有任何评论或其他方式,请回答此主题。
西尔