Я пишу приложение для Android для чтения бесконтактной карты (SpringCard в режиме эмуляции карты через мой компьютер) с протоколом ISO-DEP.
Когда я использую метод IsoDep.transceive(byte[] data), я всегда получаю IOException, но моя бесконтактная карта успешно принимает мои байты и отправляет ответ (я вижу это в журнале программы эмуляции карты).
Вопрос в том, нужно ли отправлять байт данных определенного формата (например, APDU) для метода приемопередатчика?
package com.example.nfccardreader;
import java.io.IOException;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.IsoDep;
import android.nfc.tech.NfcA;
import android.os.Bundle;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.view.Menu;
import android.widget.TextView;
public class MainActivity extends Activity {
private NfcAdapter mAdapter;
private PendingIntent mPendingIntent;
private final byte[] DATA = {
(byte) 0xFF,
(byte) 0xFA
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
resolveIntent(getIntent());
mAdapter= NfcAdapter.getDefaultAdapter(this);
mPendingIntent= PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
}
@Override
protected void onResume() {
super.onResume();
mAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);
}
@Override
protected void onPause() {
super.onPause();
if (mAdapter != null) {
mAdapter.disableForegroundDispatch(this);
}
}
private void resolveIntent(Intent intent) {
String action= intent.getAction();
if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)){
Tag tag= intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
communication(tag);
} else {
//log error
}
}
private void communication(Tag tag) {
byte[] received= null;
IsoDep card= IsoDep.get(tag);
try {
card.connect();
received= card.transceive(DATA);
} catch (IOException e) {
//log error
} finally {
try {
card.close();
} catch (IOException e) {
//log error
}
}
}
@Override
public void onNewIntent(Intent intent) {
setIntent(intent);
resolveIntent(intent);
}
}