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

0 ответов

Другие вопросы по тегам