2013-07-01 3 views
4

Я работаю над приложением для Android, которое может читать и писать на теге NFC. У меня нет проблем с чтением тега, который я уже что-то написал, но когда я использую пустой тег, у меня возникают трудности с чтением UID тега в HEX-коде.Android NFC java.io.IOException: Transceive failed

Я использую классические теги mifare, и я читаю UID непосредственно в шестнадцатеричном формате с помощью метода readblock. Странно, что он отлично работает в режиме отладчика, где я получаю UID. Но когда я пытаюсь без debbuger я получаю следующее исключение:

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";} 
} 

Я понятия не имею, как это исправить, так как он работает в отладке Режим.

+0

Как насчет использования метода 'Log.d()' для выяснения различий между отладкой и запуском? Кроме того, вы можете показать декларацию 'AndroidManifest.xml' вашего трансляционного транслятора? – tolgap

ответ

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 является: Сектор вы хотите проверить подлинность. например: 0,1,2 .... 15 для mifare Classic 1K Когда выполняется аутентификация. Затем вы можете читать или писать.

1

Этот код работает для меня. вам нужно проверить подлинность, прежде чем вы сможете прочитать блок.

MifareClassic mif = MifareClassic.get(detectedTag); 

int ttype = mif.getType(); 
Log.d(TAG, "MifareClassic tag type: " + ttype); 

int tsize = mif.getSize(); 
Log.d(TAG, "tag size: " + tsize); 

int s_len = mif.getSectorCount(); 
Log.d(TAG, "tag sector count: " + s_len); 

int b_len = mif.getBlockCount(); 
Log.d(TAG, "tag block count: " + b_len); 
try { 
    mif.connect(); 
    if (mif.isConnected()){ 

     for(int i=0; i< s_len; i++){ 

      boolean isAuthenticated = false; 

      if (mif.authenticateSectorWithKeyA(i, MifareClassic.KEY_MIFARE_APPLICATION_DIRECTORY)) { 
       isAuthenticated = true; 
      } else if (mif.authenticateSectorWithKeyA(i, MifareClassic.KEY_DEFAULT)) { 
       isAuthenticated = true; 
      } else if (mif.authenticateSectorWithKeyA(i,MifareClassic.KEY_NFC_FORUM)) { 
       isAuthenticated = true; 
      } else { 
       Log.d("TAG", "Authorization denied "); 
      } 

      if(isAuthenticated) { 
       int block_index = mif.sectorToBlock(i); 

       byte[] block = mif.readBlock(block_index); 
       String s_block = NfcUtils.ByteArrayToHexString(block); 
       Log.d(TAG, s_block); 
      } 
     } 
    } 
    mif.close(); 

} catch (IOException e) { 
    e.printStackTrace(); 
} 
Смежные вопросы