2

我有一个 Android 应用程序,该应用程序具有注册到 Android Beam 的服务和注册到主机卡仿真的服务。我想决定何时在代码中启用/禁用 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() 时,它没有任何效果。

我可以控制是否调用服务吗?

4

1 回答 1

2

您可以尝试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 ) 创建和更新 HCE 服务列表时,我没有检查 Android 源代码。因此,HCE 服务列表(NFC 系统服务已知)可能不会在每次setComponentEnabledSetting()调用时更新。

于 2014-08-25T17:10:48.050 回答