我可以阻止选择AID触发主机卡仿真服务吗?

时间:2014-08-25 13:46:36

标签: android android-service nfc access-control hce

我有一个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 个答案:

答案 0 :(得分:2)

您可以尝试 1 来禁用整个服务组件(请参阅此question/answer)并仅在您的活动位于前台时启用该服务:

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()呼叫时更新。