標籤:hostapduservice android nfc hce aid
開發HCE功能必須使用到HostApduService,在使用HostApduService時需要配置HostApduService的對應AID,同一個手機可能安裝多個HCE APP,或者同一個APP包含多個HostApduService,這時候就需要搞清楚配置的AID和對應的HostApduService之間的響應向後問題。
首先介紹一下關於HostApduService的AID配置問題,AID有兩種模式:other和payment
第一種
<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android" android:apduServiceBanner="@drawable/icon" android:description="@string/servicedesc" android:requireDeviceUnlock="false" > <!-- 可以通過指定多個aid-filter,來註冊多個AID。 category可以指定為 other 或者 payment。 requireDeviceUnlock為false的時候,可以在鎖屏狀態下完成處理,為true的時候,則會要求使用者解鎖螢幕。 --> <aid-group android:category="other" android:description="@string/app_name" > <aid-filter android:name="@string/AID1" /> </aid-group></host-apdu-service>
第二種
<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android" android:apduServiceBanner="@drawable/alipay" android:description="@string/servicedesc" android:requireDeviceUnlock="false" > <!-- 可以通過指定多個aid-filter,來註冊多個AID。 category可以指定為 other 或者 payment。 requireDeviceUnlock為false的時候,可以在鎖屏狀態下完成處理,為true的時候,則會要求使用者解鎖螢幕 --> <aid-group android:category="payment" android:description="@string/app_name" > <aid-filter android:name="@string/AID2" /> </aid-group></host-apdu-service>
下面我們來詳細說明一下關於不同模式下的AID響應問題(前提:一個手機,手機上有A、B兩個HCE APP,通過讀卡機向手機發送APDU選擇指令)
1、A和B的應用AID設定的都是payment模式,
只有手機當前選定的預設支付APP會響應,另外一個APP的AID選擇指令是不會響應的。
2、A和B的應用AID設定的都是other模式,
當A和B的AID是相同的時候系統會彈出對話方塊,列出A和B,讓使用者選擇。
如果A和B的AID不同,那麼兩個APP之間沒有相互影響。
3、A和B的應用AID設定的分別是payment(A)和other(B)模式,
如果A和B的AID相同,那麼只有A會響應選擇指令。
如果A和B的AID不同,那麼兩者之間不會相互影響
最後將如何判斷當前HCE應用是否是預設支付程式以及如何設定成預設支付程式的方法貢獻給大家
private void checkIsDefaultApp() {CardEmulation cardEmulationManager = CardEmulation.getInstance(NfcAdapter.getDefaultAdapter(this));ComponentName paymentServiceComponent = new ComponentName(getApplicationContext(), CardMangerService.class.getCanonicalName());if (!cardEmulationManager.isDefaultServiceForCategory(paymentServiceComponent, CardEmulation.CATEGORY_PAYMENT)) {Intent intent = new Intent(CardEmulation.ACTION_CHANGE_DEFAULT);intent.putExtra(CardEmulation.EXTRA_CATEGORY,CardEmulation.CATEGORY_PAYMENT);intent.putExtra(CardEmulation.EXTRA_SERVICE_COMPONENT,paymentServiceComponent);startActivityForResult(intent, 0);L.d("TAG","當前應用不是預設支付,需手動設定");} else {L.d("TAG","當前應用是系統預設支付程式");}}
Android HCE開發配置AID響應關係總結