我有一个 Android 应用程序,其中一个服务注册到 Android Beam,一个服务注册到主机卡模拟。我想决定何时在代码中启用/禁用 HCE 服务。 list 中的 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()函数.
因此,当我从主 Activity 中执行 startService() 和 stopService() 时,它没有任何效果。
我可以控制是否调用该服务吗?
最佳答案
您可以尝试1禁用整个服务组件(请参阅此 question/answer )并仅在您的 Activity 位于前台时启用该服务:
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 服务仍然响应某些命令(特别是应用程序选择),并且您仅阻止安全/隐私相关命令。例如,您可以通过在应用程序的共享首选项中设置一个标志来执行此操作(请参阅 this question 了解为什么共享首选项将成为首选方法),该标志指示是否允许该服务执行某些操作。然后,您可以在 HCE 服务中查询该标志并决定 HCE 上应提供哪些功能。
另请记住,完全禁用您的 HCE 服务(使用上述方法)可能会允许另一个应用程序(无论是否恶意)接管您的 AID 的通信。
1)我还没有检查关于何时创建和更新 HCE 服务列表的 Android 源代码。因此,HCE 服务列表(NFC 系统服务已知)可能不会在每次 setComponentEnabledSetting()
调用时更新。
关于android - 我可以防止选择 AID 触发主机卡模拟服务吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25487365/