7

NFCタグを読み書きできるAndroidアプリケーションに取り組んでいます。すでに何かを書いたタグを読み取るのに問題はありませんが、空のタグを使用すると、HEX コードでタグの UID を読み取るのが困難になります。

私は mifare クラシック タグを使用しており、readblock メソッドを使用して UID を 16 進数で直接読み取ります。奇妙なことに、UID を取得するデバッガー モードで完全に動作します。しかし、デバッガーなしで試していると、次の例外が発生します。

   java.io.IOException: Transceive failed

タグに読み込む私の方法は次のとおりです。

    static String getUID(Intent intent) {

    Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
    MifareClassic mc = MifareClassic.get(tagFromIntent);

    try {
        mc.connect();
        Log.i("connect", "ok");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        Log.i("connect", "nok");
        e.printStackTrace();
    }
    try {
        boolean secA = mc.authenticateSectorWithKeyA(0, mc.KEY_DEFAULT);
        Log.i("secA", "ok");
    } catch (IOException e) {
        Log.i("secA", "nok");
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        boolean secB = mc.authenticateSectorWithKeyB(0, mc.KEY_DEFAULT);
        Log.i("secB", "ok");
    } catch (IOException e) {
        Log.i("secB", "nok");
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    byte[] uidBytes = null;

    try {

        uidBytes = mc.readBlock(0);
        Log.i("bytes", "ok");

    } catch (IOException e) {
        Log.i("bytes", "nok");
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {

        mc.close();
        Log.i("close", "ok");
    } catch (IOException e) {
        Log.i("close", "nok");
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    if (uidBytes != null) {
    String uid = HexToString(uidBytes);

    return uid;
    }
    else { return "Repasser le tag";}
}

デバッグモードで動作するため、これを修正する方法がわかりません。

4

3 に答える 3

0

認証の問題がある可能性があります。この方法でこれを認証できます....

if (mfc.authenticateSectorWithKeyA(sectorNumber,
                MifareClassic.KEY_MIFARE_APPLICATION_DIRECTORY)) {
            Log.d("TAG", "Authorized sector with MAD key");

        } else if (mfc.authenticateSectorWithKeyA(
                sectorNumber, MifareClassic.KEY_DEFAULT)) {
            Log.d("TAG",
                    "Authorization granted to sector  with DEFAULT key");

        } else if (mfc
                .authenticateSectorWithKeyA(sectorNumber,
                        MifareClassic.KEY_NFC_FORUM)) {
            Log.d("TAG",
                    "Authorization granted to sector with NFC_FORUM key");

        } else {
            Log.d("TAG", "Authorization denied ");

            return false;
        }

SectorNumber は次のとおりです。認証するセクター。例: mifare Classic 1K の場合は 0,1,2....15 認証が完了すると、読み取りまたは書き込みが可能になります。

于 2015-01-24T10:57:42.540 に答える