2016-08-04 2 views
0

Я написал приложение для Android, которое использует функцию transceive() для связи с картой NFC-V. Моя проблема заключается в том, что строкаAndroid nfcv.transceive() выдает исключение

byte[] response = nfcv.transceive(command) 

всегда выбрасывает потерянное исключение.

Не мог бы кто-нибудь мне помочь?

String action = intent.getAction(); 

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
NfcV nfcv = NfcV.get(tag); 
if(nfcv != null) { 
    Toast.makeText(this, "nfcv detected", Toast.LENGTH_LONG).show(); 
} 

try { 
    nfcv.connect(); 
    Toast.makeText(this, "connected", Toast.LENGTH_LONG).show(); 
    byte[] command = new byte[]{      
      (byte) 0x00, // Flags 
      (byte) 0x20, // Command: Read single block 
      (byte) 0x00, // First block (offset) 
      (byte) 0x04 // Number of blocks}; 
    byte[] response = nfcv.transceive(command); 
    nfcv.close(); 
} catch(Exception e) { 
    Toast.makeText(this, "Error exception!", Toast.LENGTH_LONG).show(); 
} 

я получаю следующее исключение:

android.nfc.TagLostException: Tag was lost. 
    at android.nfc.TransceiveResult.getResponseOrThrow(TransceiveResult.java:48) 
    at android.nfc.tech.BasicTagTechnology.transceive(BasicTagTechnology.java:151) 
    at android.nfc.tech.NfcV.transceive(NfcV.java:115) 
    at com.example.nxf07589.nfc.MainActivity.onCreate(MainActivity.java:148) 
    at android.app.Activity.performCreate(Activity.java:6374) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2767) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2879) 
    at android.app.ActivityThread.access$900(ActivityThread.java:182) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1475) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:145) 
    at android.app.ActivityThread.main(ActivityThread.java:6141) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194) 
+2

Вы отбрасываете сообщение об исключении и трассировку стека, что может быть очень полезно для этой проблемы. Просто под тостом в блоке catch добавьте 'android.util.Log.e (« NFC »,« Исключение », e);', чтобы прочитать информацию об исключениях в вашем LogCat. Затем добавьте трассировку стека в свой пост. –

ответ

1

Вы получаете TagLostException, потому что ваша команда находится в неправильном формате и, следовательно, тег не отвечает.

Команда READ SINGLE BLOCK (код команды 0x20) читает, как следует из названия, одиночный блок. Поэтому в этой команде нет поля длины («числа блоков»). Правильная команда будет выглядеть следующим образом:

int blockAddress = 0; 
byte[] cmd = new byte[] { 
     (byte) 0x00, // FLAGS 
     (byte) 0x20, // READ_SINGLE_BLOCK 
     (byte)(blockAddress & 0x0ff) 
}; 
byte[] response = nfcv.transceive(cmd); 

Обратите внимание, что если тег не понимают команд (READ SINGLE BLOCK является дополнительной командой в ISO/IEC 15693), вы все равно можете получить TagLostException тогда.

И, наконец, некоторые платформы Android не работают (или просто не поддерживают) ненаправленные команды для NFC-V. Таким образом, вы можете использовать адресованную форму этой команды:

byte[] tagUid = tag.getId(); // store tag UID for use in addressed commands 

int blockAddress = 0; 
byte[] cmd = new byte[] { 
     (byte)0x20, // FLAGS 
     (byte)0x20, // READ_SINGLE_BLOCK 
     0, 0, 0, 0, 0, 0, 0, 0, 
     (byte)(blockAddress & 0x0ff) 
}; 
System.arraycopy(tagUid, 0, cmd, 2, 8); // paste tag UID into command 
byte[] response = nfcv.transceive(cmd); 
+1

thx для справки. он работает просто отлично! –

Смежные вопросы