树叶云鸿蒙OS教程:鸿蒙OS 卡模拟功能

场景介绍

应用或者其他模块可以通过接口完成以下功能:

  1. 查询是否支持指定安全单元的卡模拟功能,安全单元包括 HCE(Host Card Emulation)、ESE(Embedded Secure Element)和SIM(Subscriber Identity Module)卡。
  2. 开关卡模拟以及查询卡模拟状态,可以打开或关闭指定技术类型的卡模拟。
  3. 获取 NFC 信息,信息包括当前激活的安全单元、 Hisee 上电状态、是否支持 RSSI 查询等信息。
  4. 根据 NFC 服务的类型获取刷卡时选择服务的方式,应用或者其它模块可以查询支付(Payment)类型和非支付(Other)类型业务选择服务的方式。
  5. 动态设置和注销前台优先应用。
  6. NFC 应用的 AID 相关操作,包括注册和删除应用的 AID、查询应用是否是指定 AID 的默认应用、获取应用的 AID 等。
  7. 定义 Host 和 OffHost 服务的抽象类,三方应用通过继承抽象类来实现 NFC 卡模拟功能。

接口说明

类名接口名功能描述
CardEmulationgetInstance(NfcController controller)创建一个卡模拟类的实例。
isSupported(int feature)查询是否支持卡模拟功能。
setListenMode(int mode)设置卡模拟模式。
isListenModeEnabled()查询卡模拟功能是否打开。
getNfcInfo(String key)获取 NFC 的信息。
getSelectionType(String category)根据 NFC 服务的类型获取刷卡时选择服务的方式。
registerForegroundPreferred(Ability appAbility, ElementName appName)动态设置前台优先应用。
unregisterForegroundPreferred(Ability appAbility)取消设置前台优先应用。
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 列表。
HostServicesendResponse(byte[] response)发送响应的数据到对端设备。
handleRemoteCommand(byte[] cmd, IntentParams params)处理对端设备发送的命令。
disabledCallback(int errCode)连接异常的回调。
OffHostServiceonConnect(Intent intent)连接服务并获取远程服务对象。

查询是否支持卡模拟功能

  1. 调用 NfcController 类的 getInstance(Context context) 接口,获取 NfcController 实例。
  1. 调用 CardEmulation 类的 getInstance(NfcController controller) 接口,获取 CardEmulation 实例,去管理本机卡模拟模块操作。
  1. 调用 isSupported(int feature) 接口去查询是否 HCE、UICC、ESE 卡模拟。
   // 获取NFC控制对象
   NfcController nfcController = NfcController.getInstance(context);
   // 获取卡模拟控制对象
   CardEmulation cardEmulation = CardEmulation.getInstance(nfcController);
   // 查询是否支持HCE、UICC、ESE卡模拟,返回值表示是否支持对应安全单元的卡模拟
   boolean isSupportedHce = cardEmulation.isSupported(CardEmulation.FEATURE_HCE);
   boolean isSupportedUicc = cardEmulation.isSupported(CardEmulation.FEATURE_UICC);
   boolean isSupportedEse = cardEmulation.isSupported(CardEmulation.FEATURE_ESE);

开关卡模拟及查询卡模拟状态

  1. 调用 NfcController 类的 getInstance(Context context) 接口,获取 NfcController 实例。
  1. 调用 CardEmulation 类的 getInstance(NfcController controller) 接口,获取 CardEmulation 实例,去管理本机卡模拟模块操作。
  1. 调用 setListenMode(int mode) 接口去打开或者关闭卡模拟。
  1. 调用 isListenModeEnabled() 接口去查询卡模拟是否打开。
   // 获取 NFC 控制对象
   NfcController nfcController = NfcController.getInstance(context);
   // 获取卡模拟控制对象
   CardEmulation cardEmulation = CardEmulation.getInstance(nfcController);
   // 打开卡模拟
   cardEmulation.setListenMode(CardEmulation.ENABLE_MODE_ALL);
   // 调用查询卡模拟开关状态的接口,返回值为卡模拟是否是打开的状态
   boolean isEnabled = cardEmulation.isListenModeEnabled(); // true
   // 关闭卡模拟
   cardEmulation.setListenMode(CardEmulation.DISABLE_MODE_A_B);
   // 调用查询卡模拟开关状态的接口,返回值为卡模拟是否是打开的状态
   isEnabled = cardEmulation.isListenModeEnabled(); // false

获取 NFC 信息

  1. 调用 NfcController 类的 getInstance(Context context) 接口,获取 NfcController 实例。
  1. 调用 CardEmulation 类的getInstance(NfcController controller)接口,获取 CardEmulation 实例,去管理本机卡模拟模块操作。
  1. 调用 getNfcInfo(String key)接口去获取 NFC 信息。
   // 获取NFC控制对象
   NfcController nfcController = NfcController.getInstance(context);
   // 获取卡模拟控制对象
   CardEmulation cardEmulation = CardEmulation.getInstance(nfcController);
   // 查询本机当前使能的安全单元类型
   String seType = cardEmulation.getNfcInfo(CardEmulation.KEY_ENABLED_SE_TYPE); // ENABLED_SE_TYPE_ESE
   // 查询Hisee上电状态
   String hiseeState = cardEmulation.getNfcInfo(CardEmulation.KEY_HISEE_READY);
   // 查询是否支持rssi的查询
   String rssiAbility = cardEmulation.getNfcInfo(CardEmulation.KEY_RSSI_SUPPORTED);

根据NFC服务的类型获取刷卡时选择服务的方式

  1. 调用 NfcController 类的 getInstance(Context context) 接口,获取 NfcController 实例。
  1. 调用 CardEmulation 类的 getInstance(NfcController controller) 接口,获取 CardEmulation 实例,去管理本机卡模拟模块操作。
  1. 调用 getSelectionType(Sring category) 接口去获取选择服务的方式。
   // 获取NFC控制对象
   NfcController nfcController = NfcController.getInstance(context);
   // 获取卡模拟控制对象
   CardEmulation cardEmulation = CardEmulation.getInstance(nfcController);
   // 获取选择服务的方式
   int result = cardEmulation.getSelectionType(CardEmulation.CATEGORY_PAYMENT); // SELECTION_TYPE_PREFER_DEFAULT
   result = cardEmulation.getSelectionType(CardEmulation.CATEGORY_OTHER); // SELECTION_TYPE_ASK_IF_CONFLICT

动态设置和注销前台优先应用

  1. 调用 NfcController 类的 getInstance(Context context)接口,获取 NfcController 实例。
  1. 调用 CardEmulation 类的 getInstance(NfcController controller) 接口,获取 CardEmulation 实例,去管理本机卡模拟模块操作。
  1. 调用 registerForegroundPreferred(Ability appAbility, ElementName appName)接口去动态设置前台优先应用。
  1. 调用 unregisterForegroundPreferred(Ability appAbility)接口去取消设置前台优先应用。
   // 获取NFC控制对象
   NfcController nfcController = NfcController.getInstance(context);
   // 获取卡模拟控制对象
   CardEmulation cardEmulation = CardEmulation.getInstance(nfcController);
   // 动态设置前台优先应用
   cardEmulation.registerForegroundPreferred(new Ability(), new ElementName());
   // 注销前台优先应用
   cardEmulation.unregisterForegroundPreferred(new Ability());

NFC 应用的 AID 相关操作

  1. 调用 NfcController 类的 getInstance(Context context) 接口,获取 NfcController 实例。
  1. 调用 CardEmulation 类的 getInstance(NfcController controller)接口,获取 CardEmulation 实例,去管理本机卡模拟模块操作。
  1. 调用 registerAids(ElementName appName, String type, List<String> aids) 接口去给应用注册指定类型的 AID。
  1. 调用 removeAids(ElementName appName, String type) 接口去删除应用的指定类型的 AID。
  1. 调用 isDefaultForAid(ElementName appName, String aid) 接口去判断应用是否是指定 AID 的默认处理应用。
  1. 调用 getAids(ElementName appName, String type) 接口去获取应用中指定类型的 AID 列表。
   // 获取NFC控制对象
   NfcController nfcController = NfcController.getInstance(context);
   // 获取卡模拟控制对象
   CardEmulation cardEmulation = CardEmulation.getInstance(nfcController);
   // 给应用注册指定类型的AID
   List<String> aids = new ArrayList<String>();
   aids.add(0, "A0028321901280");
   aids.add(1, "A0028321901281");
   try {    cardEmulation.registerAids(new ElementName(), CardEmulation.CATEGORY_PAYMENT, aids);
   } catch (IllegalArgumentException e) {
       HiLog.error(LABEL, "IllegalArgumentException when registerAids");
   }
   // 删除应用的指定类型的AID
   cardEmulation.removeAids(new ElementName(), CardEmulation.CATEGORY_PAYMENT);
   cardEmulation.removeAids(new ElementName(), CardEmulation.CATEGORY_OTHER);
   // 判断应用是否是指定AID的默认处理应用
   String aid = "A0028321901280";
   cardEmulation.isDefaultForAid(new ElementName(), aid);
   // 获取应用中指定类型的AID列表
   try {
       cardEmulation.getAids(new ElementName(), CardEmulation.CATEGORY_PAYMENT);
   } catch (NullPointerException e) {
       HiLog.error(LABEL, "NullPointerException when getAids");
   } catch (IllegalArgumentException e) {
       HiLog.error(LABEL, "IllegalArgumentException when getAids");
   }

Host服务的抽象类

  1. 三方应用的服务继承 HostService,实现 HCE 卡模拟功能。
  1. 三方应用自定义实现抽象方法handleRemoteCommand(byte[] cmd, IntentParams params)和disabledCallback()。
  1. 三方应用自定义功能。
   // 三方HCE应用的服务继承HostService,实现HCE卡模拟功能
   public class AppService extends HostService {
       @Override
       public byte[] handleRemoteCommand(byte[] cmd, IntentParams params) {
       // 三方应用自定义接口实现。
       }

       
       @Override
       public void disabledCallback(int errCode) {
       // 三方应用自定义接口实现。
       }

    
       // 三方应用自定义功能
   }

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/166698.html<

(0)
运维的头像运维
上一篇2025-03-20 16:08
下一篇 2025-03-20 16:10

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注