Могу ли я предотвратить запуск службы эмуляции хост-карты, выбрав 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()
вызов.