NFC HCE в Google Nexus 7 (2012) не работает со считывателем ACR122
Я пишу и приложение для соединения с системой Android по NFC, протестировано на Google Nexus 4 и 5, и все работает нормально, но с Google Nexus 7 (2012) не работает. Вы можете мне помочь. Код из приложения на Java:
if (cardTerminal.isCardPresent()) {
try {
Card card = cardTerminal.connect("direct");
ApduTagReaderWriter readerWriter = new ApduTagReaderWriter(new AcsDirectChannelTag(TagType.ISO_DEP,
null, card));
try {
IsoDepTamaCommunicator tamaCommunicator = new IsoDepTamaCommunicator(readerWriter, readerWriter);
String data = tamaCommunicator.connectAsInitiator();
}
}
}
Вот IsoDepTamaCommunicator и inListPassiveTargetResp.getNumberOfTargets() возвращает 0 с Nexus 7, но не с Nexus 4,5.
public class IsoDepTamaCommunicator extends AbstractTamaCommunicator {
private static final String EMPTY_STRING = "";
private boolean IsConnected = false;
private static final byte[] CLA_INS_P1_P2 = { 0x00, (byte)0xA4, 0x04, 0x00 };
private static final byte[] AID_ANDROID = { (byte)0xF0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
public IsoDepTamaCommunicator(ByteArrayReader reader, ByteArrayWriter writer) {
super(reader, writer);
}
public String connectAsInitiator() throws IOException {
InListPassiveTargetResp inListPassiveTargetResp = sendMessage(new InListPassiveTargetReq((byte) 1, (byte) 0,
new byte[0]));
if (inListPassiveTargetResp.getNumberOfTargets() > 0) {
System.out.println("TargetData: " + NfcUtils.convertBinToASCII(inListPassiveTargetResp.getTargetData()));
if (inListPassiveTargetResp.isIsoDepSupported()) {
System.out.println("IsoDep Supported");
byte[] selectAidApdu = createSelectAidApdu(AID_ANDROID);
DataExchangeResp resp = sendMessage(new DataExchangeReq(inListPassiveTargetResp.getTargetId(),
false, selectAidApdu, 0, selectAidApdu.length));
String dataIn = new String(resp.getDataOut());
if (dataIn.startsWith("test:")) {
dataIn = dataIn.substring(5, dataIn.length());
IsConnected = true;
return dataIn;
}
} else {
System.out.println("IsoDep NOT Supported");
return EMPTY_STRING;
}
}
return EMPTY_STRING;
}
private byte[] createSelectAidApdu(byte[] aid) {
byte[] result = new byte[6 + aid.length];
System.arraycopy(CLA_INS_P1_P2, 0, result, 0, CLA_INS_P1_P2.length);
result[4] = (byte)aid.length;
System.arraycopy(aid, 0, result, 5, aid.length);
result[result.length - 1] = 0;
return result;
}
}
На андроид устройстве отправляет сообщение функция:
public class MyHostApduService extends HostApduService {
@Override
public byte[] processCommandApdu(byte[] apdu, Bundle extras) {
String message = "test:message";
return message.getBytes();
}
@Override
public void onDeactivated(int reason) {
}
}
и в androidManifest.xml добавили следующий сервис:
<service
android:name=".MyHostApduService"
android:exported="true"
android:permission="android.permission.BIND_NFC_SERVICE" >
<intent-filter>
<action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE" />
</intent-filter>
<meta-data
android:name="android.nfc.cardemulation.host_apdu_service"
android:resource="@xml/apduservice" />
</service>
Все отлично работает с Google Nexus 4 и 5 и не работает с Google Nexus 7. На всех тестируемых устройствах установлен Android версии 5.0