Могу ли я предотвратить запуск службы эмуляции хост-карты, выбрав AID?

У меня есть приложение Android с сервисом, зарегистрированным для Android луча, и сервисом, зарегистрированным для эмуляции хост-карты. Я хочу решить, когда включить / отключить службу HCE в коде. Сервис HCE в манифесте выглядит так:

<service
        android:name="com.bimo.verifonewallet.service.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>

Фактически, когда смартфон получает команду выбора AID (с AID служб), служба запускается, и выполняется функция службы onCreate(), и после завершения транзакции вызывается функция onDestroy().

Поэтому, когда я делаю startService() и stopService() из основного действия, это не имеет никакого эффекта.

Могу ли я контролировать, будет ли служба вызываться или нет?

1 ответ

Вы можете попробовать1 отключить весь компонент службы (см. Этот вопрос / ответ) и включить службу только тогда, когда ваша деятельность находится на переднем плане:

public void onResume() {
    super.onResume();

    PackageManager pm = getPackageManager();
    pm.setComponentEnabledSetting(new ComponentName(this, "com.example.app.HceService"),
                                  PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                                  PackageManager.DONT_KILL_APP);
}

public void onPause() {
    super.onPause();

    PackageManager pm = getPackageManager();
    pm.setComponentEnabledSetting(new ComponentName(this, "com.example.app.HceService"),
                                  PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                                  PackageManager.DONT_KILL_APP);
}

Однако я настоятельно рекомендую, чтобы ваша служба HCE все еще реагировала на определенные команды (в частности, выбор приложения) и чтобы вы блокировали только команды, относящиеся к безопасности и конфиденциальности. Например, вы можете сделать это, установив флаг в общих настройках вашего приложения (см. Этот вопрос о том, почему общие предпочтения будут предпочтительным подходом), который указывает, разрешено ли службе выполнять определенные действия или нет. Затем вы можете запросить этот флаг в службе HCE и решить, какие функции должны быть доступны через HCE.

Также имейте в виду, что полное отключение службы HCE (с использованием вышеуказанного метода) может позволить другому приложению (вредоносному или нет) перехватить связь для вашего AID.


1) Я не проверял источник Android при создании и обновлении списка служб HCE. Таким образом, может случиться так, что список служб HCE (известный системной службе NFC) может обновляться не на каждом setComponentEnabledSetting() вызов.

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