android - 我可以防止选择 AID 触发主机卡模拟服务吗?

标签 android android-service nfc access-control hce

我有一个 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/

相关文章:

android - Activity 关闭后服务停止工作, Activity 停止时调试器停止

usb - 无法声明 USB 接口(interface)(设备或资源繁忙) 卡住

c# - NFC MIFARE Classic 1K 无法读写

Android Studio 生成签名的 apk 不适用于构建 0.3.6 - 给出错误

java - 有哪些方法可以在 Android 上进行多核编程,而不仅仅是多线程?

android - Fresco 库问题

android - 需要获得服务才能回话 Activity

android - 应用程序终止时从 Activity 调用方法到服务

安卓布局: on TextView and android:drawableStart -- setting size of the icon?

ios - iPhone 可以充当 NFC 标签吗?