Не удается подключить Android HCE с помощью метода javax.smartcardio.CardTerminal connect()

Итак, сейчас я создаю простое приложение для эмуляции смарт-карты с использованием Android HCE (эмуляция карт на основе хоста). Приложение возвращает массив байтов только {90,00} для каждой полученной команды APDU. Вот код:

public class MyHostApduService extends HostApduService {

    @Override
    public byte[] processCommandApdu(byte[] apdu, Bundle extras) {
        byte[] response = new byte[2];
        response[0] = (byte)0x90;
        response[1] = 0x00;
        return response;
    }

    //Rest of the code...
}

И затем я попытался подключить свой смартфон (я использую Sony Xperia M2) к устройству чтения смарт-карт (ACR122U-A9), используя метод CardTerminal.connect() из javax.smartcardio.CardTerminal, как это

Card card = terminal.connect("*");

Он работал для настоящей смарт-карты, но не хочет подключать мой телефон. Есть звуковой сигнал, но светодиод выключился (он не стал зеленым, как при обнаружении настоящей смарт-карты), и когда я вынимаю смартфон, я получил CardException, и светодиод снова стал красным. Иногда кажется, что считыватель подключен к телефону (светодиод стал зеленым), но телефон не получает APDU. Я также пытался подключиться с помощью scScriptor.exe из Springcard с тем же результатом.

Я что-то пропустил в коде? Или, возможно, техническая проблема?

РЕДАКТИРОВАТЬ: я установил файл apk на galaxy s iii моего друга, и он работает, поэтому я подозреваю, что это проблема телефона.


person user1749623    schedule 16.09.2014    source источник


Ответы (1)


Если я правильно понял и ваша проблема связана с Android-клиентом, возможно, вы пропустили определение правильных AID для своего приложения в манифесте и в xml-файле (см. также https://developer.android.com/guide/topics/connectivity/nfc/hce.html) Вы также можете просто зарегистрируйте неправильные AID - запишите свои apdu-команды, чтобы увидеть, к какой помощи может обратиться читатель.

AndroidМанифест:

 <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>

apduservice.xml (заполните свои AID в теге help-filter):

 <host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
           android:description="@string/servicedesc"
           android:requireDeviceUnlock="false">
    <aid-group android:description="@string/aiddescription"
               android:category="other">
        <aid-filter android:name="F0010203040506"/>
        <aid-filter android:name="F0394148148100"/>
    </aid-group>
</host-apdu-service>
person phil    schedule 16.09.2014
comment
Что ж, я уже добавляю эти xml-файлы и выполняю все шаги и требования на странице разработчика Android о hce, и все еще не работаю. - person user1749623; 18.09.2014
comment
Все права выставлены? Можете ли вы убедиться, что терминал отправляет команду? Пробовали вести журнал? Если у вас есть телефон Android 4.4 с включенным NFC и всеми установленными разрешениями, этот код должен работать нормально. Я использую Нексус 5 - person phil; 24.09.2014