树叶云鸿蒙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

相关推荐

  • 服务器域名解析失败怎么排查,是什么原因造成的?

    服务器域名解析失败的根本原因在于DNS系统无法将域名正确转换为IP地址,排查应遵循从客户端到服务端的顺序:先检查本地网络和DNS缓存,再验证域名解析记录和权威服务器状态,第一步:检查本地网络与DNS设置测试网络连通性先确认你的设备是否正常联网,打开命令提示符或终端,输入ping 8.8.8.8,如果返回回复数据……

    2026-07-27
    0
  • 站群服务器怎么设置不同环境配置,有哪些注意事项?

    站群服务器设置不同的环境配置,核心在于通过虚拟化或容器化技术实现站点隔离,再结合Web服务器配置为每个站点分配独立的PHP版本、数据库及运行参数,从而满足多样化需求,为什么站群服务器需要环境隔离?不同CMS依赖的PHP版本差异明显,例如WordPress推荐PHP 7.4以上,而Drupal 7仍基于PHP 5……

    2026-07-27
    0
  • 站群服务器如何批量管理更高效,有哪些管理技巧?

    站群服务器批量管理想提效,自动化是唯一出路,通过统一配置管理工具与面板系统,结合服务商提供的底层基础设施支持,能将运维效率提升数倍,批量管理的核心痛点与解决思路多台站群服务器分散管理,最常见的问题就是重复劳动,每次软件更新、配置修改、安全加固,都需要逐台登录操作,不仅耗时,还容易漏掉某台机器,更头疼的是,一旦某……

    2026-07-27
    0
  • 服务器磁盘IO过高如何优化?,磁盘IO过高的原因有哪些?

    服务器磁盘IO过高,核心优化路径是“先定位、再分流、后升级”,你需要通过系统工具精确判断究竟是应用程序、日志策略还是硬件瓶颈导致,然后针对性地从代码、缓存、存储架构和硬件选型四个层面下手,其中选择持有持牌自营机房和增值电信业务经营许可证的服务商,能从根本上保障底层IO稳定性,定位IO瓶颈:动手优化的第一步盲目优……

    2026-07-27
    0
  • 跨境网站访问延迟高怎么解决,网站访问慢的原因是什么?

    跨境网站访问延迟高的核心解决思路在于多维度优化网络路径,包括使用全球CDN加速、选择靠近目标区域的优质IDC机房、调整传输协议以及精简应用层资源,其中服务商的基础设施质量直接决定优化上限,为什么跨境访问延迟高?三大核心因素物理距离与光速限制数据包在海底光缆中的传输速度受限于介质,从中国到美国西海岸的物理往返时间……

    2026-07-27
    0

发表回复

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