1

奇妙な問題があります。プログラムをデバッグし、「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;
    }
}

助けてくれてありがとう
Sylvain

4

1 に答える 1

0

私は一歩前進します。スレッドの問題が原因のようです。MifareClassicの「writeblock」コマンドは、アクティビティのメインプロセスによってトリガーされる必要があります。私のアプリでは、「writeblock」をトリガーしたのはボタン(OnClickListenerを実装)です。デバッグモードの場合、デバッグスレッドはメインスレッドであるため、この動作を非表示にしてアプリを正常に実行できます。

したがって、これからは、rfフィールドからタグを削除して元に戻すようにユーザーに依頼するだけです。そのため、タグが再度検出されたという意図があり、「writeblock」コマンドを問題なく実行できます。

最後に、タグの読み取りと書き込みを処理する最良の方法は、読み取り用と書き込み用の2つのアクティビティを作成することです。

コメントやその他の方法がある場合は、このスレッドに回答してください。

シルヴァン

于 2011-06-26T10:44:48.023 に答える