鴻蒙OS 卡模擬功能

2020-09-18 15:02 更新

場景介紹

應用或者其他模塊可以通過接口完成以下功能:

  1. 查詢是否支持指定安全單元的卡模擬功能,安全單元包括 HCE(Host Card Emulation)、ESE(Embedded Secure Element)和SIM(Subscriber Identity Module)卡。
  2. 開關卡模擬以及查詢卡模擬狀態(tài),可以打開或關閉指定技術類型的卡模擬。
  3. 獲取 NFC 信息,信息包括當前激活的安全單元、 Hisee 上電狀態(tài)、是否支持 RSSI 查詢等信息。
  4. 根據(jù) NFC 服務的類型獲取刷卡時選擇服務的方式,應用或者其它模塊可以查詢支付(Payment)類型和非支付(Other)類型業(yè)務選擇服務的方式。
  5. 動態(tài)設置和注銷前臺優(yōu)先應用。
  6. NFC 應用的 AID 相關操作,包括注冊和刪除應用的 AID、查詢應用是否是指定 AID 的默認應用、獲取應用的 AID 等。
  7. 定義 Host 和 OffHost 服務的抽象類,三方應用通過繼承抽象類來實現(xiàn) NFC 卡模擬功能。

接口說明

類名 接口名 功能描述
CardEmulation getInstance(NfcController controller) 創(chuàng)建一個卡模擬類的實例。
isSupported(int feature) 查詢是否支持卡模擬功能。
setListenMode(int mode) 設置卡模擬模式。
isListenModeEnabled() 查詢卡模擬功能是否打開。
getNfcInfo(String key) 獲取 NFC 的信息。
getSelectionType(String category) 根據(jù) NFC 服務的類型獲取刷卡時選擇服務的方式。
registerForegroundPreferred(Ability appAbility, ElementName appName) 動態(tài)設置前臺優(yōu)先應用。
unregisterForegroundPreferred(Ability appAbility) 取消設置前臺優(yōu)先應用。
isDefaultForAid(ElementName appName, String aid) 判斷應用是否是指定 AID 的默認處理應用。
registerAids(ElementName appName, String type, List<String> aids) 給應用注冊指定類型的AID。
removeAids(ElementName appName, String type) 刪除應用的指定類型的 AID。
getAids(ElementName appName, String type) 獲取應用中指定類型的 AID 列表。
HostService sendResponse(byte[] response) 發(fā)送響應的數(shù)據(jù)到對端設備。
handleRemoteCommand(byte[] cmd, IntentParams params) 處理對端設備發(fā)送的命令。
disabledCallback(int errCode) 連接異常的回調(diào)。
OffHostService onConnect(Intent intent) 連接服務并獲取遠程服務對象。

查詢是否支持卡模擬功能

  1. 調(diào)用 NfcController 類的 getInstance(Context context) 接口,獲取 NfcController 實例。

  1. 調(diào)用 CardEmulation 類的 getInstance(NfcController controller) 接口,獲取 CardEmulation 實例,去管理本機卡模擬模塊操作。

  1. 調(diào)用 isSupported(int feature) 接口去查詢是否 HCE、UICC、ESE 卡模擬。

  1. // 獲取NFC控制對象
  2. NfcController nfcController = NfcController.getInstance(context);
  3. // 獲取卡模擬控制對象
  4. CardEmulation cardEmulation = CardEmulation.getInstance(nfcController);
  5. // 查詢是否支持HCE、UICC、ESE卡模擬,返回值表示是否支持對應安全單元的卡模擬
  6. boolean isSupportedHce = cardEmulation.isSupported(CardEmulation.FEATURE_HCE);
  7. boolean isSupportedUicc = cardEmulation.isSupported(CardEmulation.FEATURE_UICC);
  8. boolean isSupportedEse = cardEmulation.isSupported(CardEmulation.FEATURE_ESE);

開關卡模擬及查詢卡模擬狀態(tài)

  1. 調(diào)用 NfcController 類的 getInstance(Context context) 接口,獲取 NfcController 實例。

  1. 調(diào)用 CardEmulation 類的 getInstance(NfcController controller) 接口,獲取 CardEmulation 實例,去管理本機卡模擬模塊操作。

  1. 調(diào)用 setListenMode(int mode) 接口去打開或者關閉卡模擬。

  1. 調(diào)用 isListenModeEnabled() 接口去查詢卡模擬是否打開。

  1. // 獲取 NFC 控制對象
  2. NfcController nfcController = NfcController.getInstance(context);
  3. // 獲取卡模擬控制對象
  4. CardEmulation cardEmulation = CardEmulation.getInstance(nfcController);
  5. // 打開卡模擬
  6. cardEmulation.setListenMode(CardEmulation.ENABLE_MODE_ALL);
  7. // 調(diào)用查詢卡模擬開關狀態(tài)的接口,返回值為卡模擬是否是打開的狀態(tài)
  8. boolean isEnabled = cardEmulation.isListenModeEnabled(); // true
  9. // 關閉卡模擬
  10. cardEmulation.setListenMode(CardEmulation.DISABLE_MODE_A_B);
  11. // 調(diào)用查詢卡模擬開關狀態(tài)的接口,返回值為卡模擬是否是打開的狀態(tài)
  12. isEnabled = cardEmulation.isListenModeEnabled(); // false

獲取 NFC 信息

  1. 調(diào)用 NfcController 類的 getInstance(Context context) 接口,獲取 NfcController 實例。

  1. 調(diào)用 CardEmulation 類的getInstance(NfcController controller)接口,獲取 CardEmulation 實例,去管理本機卡模擬模塊操作。

  1. 調(diào)用 getNfcInfo(String key)接口去獲取 NFC 信息。

  1. // 獲取NFC控制對象
  2. NfcController nfcController = NfcController.getInstance(context);
  3. // 獲取卡模擬控制對象
  4. CardEmulation cardEmulation = CardEmulation.getInstance(nfcController);
  5. // 查詢本機當前使能的安全單元類型
  6. String seType = cardEmulation.getNfcInfo(CardEmulation.KEY_ENABLED_SE_TYPE); // ENABLED_SE_TYPE_ESE
  7. // 查詢Hisee上電狀態(tài)
  8. String hiseeState = cardEmulation.getNfcInfo(CardEmulation.KEY_HISEE_READY);
  9. // 查詢是否支持rssi的查詢
  10. String rssiAbility = cardEmulation.getNfcInfo(CardEmulation.KEY_RSSI_SUPPORTED);

根據(jù)NFC服務的類型獲取刷卡時選擇服務的方式

  1. 調(diào)用 NfcController 類的 getInstance(Context context) 接口,獲取 NfcController 實例。

  1. 調(diào)用 CardEmulation 類的 getInstance(NfcController controller) 接口,獲取 CardEmulation 實例,去管理本機卡模擬模塊操作。

  1. 調(diào)用 getSelectionType(Sring category) 接口去獲取選擇服務的方式。

  1. // 獲取NFC控制對象
  2. NfcController nfcController = NfcController.getInstance(context);
  3. // 獲取卡模擬控制對象
  4. CardEmulation cardEmulation = CardEmulation.getInstance(nfcController);
  5. // 獲取選擇服務的方式
  6. int result = cardEmulation.getSelectionType(CardEmulation.CATEGORY_PAYMENT); // SELECTION_TYPE_PREFER_DEFAULT
  7. result = cardEmulation.getSelectionType(CardEmulation.CATEGORY_OTHER); // SELECTION_TYPE_ASK_IF_CONFLICT

動態(tài)設置和注銷前臺優(yōu)先應用

  1. 調(diào)用 NfcController 類的 getInstance(Context context)接口,獲取 NfcController 實例。

  1. 調(diào)用 CardEmulation 類的 getInstance(NfcController controller) 接口,獲取 CardEmulation 實例,去管理本機卡模擬模塊操作。

  1. 調(diào)用 registerForegroundPreferred(Ability appAbility, ElementName appName)接口去動態(tài)設置前臺優(yōu)先應用。

  1. 調(diào)用 unregisterForegroundPreferred(Ability appAbility)接口去取消設置前臺優(yōu)先應用。

  1. // 獲取NFC控制對象
  2. NfcController nfcController = NfcController.getInstance(context);
  3. // 獲取卡模擬控制對象
  4. CardEmulation cardEmulation = CardEmulation.getInstance(nfcController);
  5. // 動態(tài)設置前臺優(yōu)先應用
  6. cardEmulation.registerForegroundPreferred(new Ability(), new ElementName());
  7. // 注銷前臺優(yōu)先應用
  8. cardEmulation.unregisterForegroundPreferred(new Ability());

NFC 應用的 AID 相關操作

  1. 調(diào)用 NfcController 類的 getInstance(Context context) 接口,獲取 NfcController 實例。

  1. 調(diào)用 CardEmulation 類的 getInstance(NfcController controller)接口,獲取 CardEmulation 實例,去管理本機卡模擬模塊操作。

  1. 調(diào)用 registerAids(ElementName appName, String type, List<String> aids) 接口去給應用注冊指定類型的 AID。

  1. 調(diào)用 removeAids(ElementName appName, String type) 接口去刪除應用的指定類型的 AID。

  1. 調(diào)用 isDefaultForAid(ElementName appName, String aid) 接口去判斷應用是否是指定 AID 的默認處理應用。

  1. 調(diào)用 getAids(ElementName appName, String type) 接口去獲取應用中指定類型的 AID 列表。

  1. // 獲取NFC控制對象
  2. NfcController nfcController = NfcController.getInstance(context);
  3. // 獲取卡模擬控制對象
  4. CardEmulation cardEmulation = CardEmulation.getInstance(nfcController);
  5. // 給應用注冊指定類型的AID
  6. List<String> aids = new ArrayList<String>();
  7. aids.add(0, "A0028321901280");
  8. aids.add(1, "A0028321901281");
  9. try { cardEmulation.registerAids(new ElementName(), CardEmulation.CATEGORY_PAYMENT, aids);
  10. } catch (IllegalArgumentException e) {
  11. HiLog.error(LABEL, "IllegalArgumentException when registerAids");
  12. }
  13. // 刪除應用的指定類型的AID
  14. cardEmulation.removeAids(new ElementName(), CardEmulation.CATEGORY_PAYMENT);
  15. cardEmulation.removeAids(new ElementName(), CardEmulation.CATEGORY_OTHER);
  16. // 判斷應用是否是指定AID的默認處理應用
  17. String aid = "A0028321901280";
  18. cardEmulation.isDefaultForAid(new ElementName(), aid);
  19. // 獲取應用中指定類型的AID列表
  20. try {
  21. cardEmulation.getAids(new ElementName(), CardEmulation.CATEGORY_PAYMENT);
  22. } catch (NullPointerException e) {
  23. HiLog.error(LABEL, "NullPointerException when getAids");
  24. } catch (IllegalArgumentException e) {
  25. HiLog.error(LABEL, "IllegalArgumentException when getAids");
  26. }

Host服務的抽象類

  1. 三方應用的服務繼承 HostService,實現(xiàn) HCE 卡模擬功能。

  1. 三方應用自定義實現(xiàn)抽象方法handleRemoteCommand(byte[] cmd, IntentParams params)和disabledCallback()。

  1. 三方應用自定義功能。

  1. // 三方HCE應用的服務繼承HostService,實現(xiàn)HCE卡模擬功能
  2. public class AppService extends HostService {
  3. @Override
  4. public byte[] handleRemoteCommand(byte[] cmd, IntentParams params) {
  5. // 三方應用自定義接口實現(xiàn)。
  6. }
  7. @Override
  8. public void disabledCallback(int errCode) {
  9. // 三方應用自定義接口實現(xiàn)。
  10. }
  11. // 三方應用自定義功能
  12. }
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號