# @ohos.nfc.cardEmulation (标准NFC-cardEmulation) 本模块主要提供NFC卡模拟业务,包括判断支持哪种卡模拟类型,HCE卡模拟的业务实现等。 HCE(Host Card Emulation),称为基于主机的卡模拟,表示不依赖安全单元芯片,应用程序模拟NFC卡片,可以通过NFC服务和NFC读卡器通信。 > **说明:** > > 本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 ## HCE卡模拟和AID列表的声明定义 开发HCE卡模拟相关应用时,需要在应用的属性配置文件中,声明与NFC相关的属性值,比如,在module.json5文件中,声明下面属性值: ```json { "module": { // other declared attributes. "abilities": [ { // other declared attributes. "skills": [ { "actions": [ "ohos.nfc.cardemulation.action.HOST_APDU_SERVICE" ] } ], "metadata": [ { "name": "payment-aid", "value": "your payment aid" }, { "name": "other-aid", "value": "your other aid" } ] } ], "requestPermissions": [ { "name": "ohos.permission.NFC_CARD_EMULATION", // should add variable card_emulation_reason in string.json "reason": "$string:card_emulation_reason", } ] } } ``` > **注意:** >1. 声明"actions"字段的内容填写,必须包含"ohos.nfc.cardemulation.action.HOST_APDU_SERVICE",不能更改。 >2. 声明aid时,name必须为payment-aid,或者other-aid。填写错误会造成解析失败。 >3. 声明权限时"requestPermissions"中的"name"字段的内容填写,必须是"ohos.permission.NFC_CARD_EMULATION",不能更改。 ## 导入模块 ``` import { cardEmulation } from '@kit.ConnectivityKit'; ``` ## FeatureType(deprecated) 定义不同的NFC卡模拟类型。 > **说明:** > 从 API version 6 开始支持,从 API version 9 开始废弃,建议使用[hasHceCapability](#hashcecapability9)替代。 **系统能力:** SystemCapability.Communication.NFC.CardEmulation | 名称 | 值 | 说明 | | ---- | ---- | -------- | | HCE | 0 | HCE 卡模拟。 | | UICC | 1 | SIM 卡模拟。 | | ESE | 2 | ESE 卡模拟。 | ## CardType9+ 定义卡模拟应用所使用的业务类型,是支付类型,还是其他类型。 **系统能力:** SystemCapability.Communication.NFC.CardEmulation **原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 | 名称 | 值 | 说明 | | ------- | --------- | ----------------- | | PAYMENT | "payment" | 卡模拟应用所使用的业务是支付类型。 | | OTHER | "other" | 卡模拟应用所使用的业务是其他类型。 | ## isSupported(deprecated) isSupported(feature: number): boolean 是否支持某种类型的卡模拟。 > **说明:** > 从 API version 6 开始支持,从 API version 9 开始废弃,建议使用[hasHceCapability](#hashcecapability9)替代。 **系统能力:** SystemCapability.Communication.NFC.CardEmulation **参数:** | 参数名 | 类型 | 必填 | 说明 | | ------- | ------ | ---- | ---------------------------------------- | | feature | number | 是 | 卡模拟类型值,详细请见[FeatureType](#featuretypedeprecated)枚举值。 | **返回值:** | **类型** | **说明** | | ------- | -------------------------------------- | | boolean | true: 支持该类型卡模拟, false: 不支持该类型卡模拟。 | **示例:** ```js import { cardEmulation } from '@kit.ConnectivityKit'; let isHceSupported: boolean = cardEmulation.isSupported(cardEmulation.FeatureType.HCE); if (!isHceSupported) { console.log('this device is not supported for HCE, ignore it.'); } ``` ## hasHceCapability9+ hasHceCapability(): boolean 判断设备是否支持HCE卡模拟功能。 **系统能力:** SystemCapability.Communication.NFC.CardEmulation **需要权限:** ohos.permission.NFC_CARD_EMULATION **原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 **返回值:** | **类型** | **说明** | | ------- | -------------------------------- | | boolean | true: 支持HCE, false: 不支持HCE。 | **错误码**: 以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。 | 错误码ID | 错误信息 | | -------- | ---------------------------- | |201 | Permission denied. | |801 | Capability not supported. | **示例:** ```js import { cardEmulation } from '@kit.ConnectivityKit'; let hasHceCap: boolean = cardEmulation.hasHceCapability(); if (!hasHceCap) { console.log('this device hasHceCapability false, ignore it.'); } ``` ## isDefaultService9+ isDefaultService(elementName: ElementName, type: CardType): boolean 判断指定的应用是否为指定业务类型的默认应用。 **系统能力:** SystemCapability.Communication.NFC.CardEmulation **需要权限:** ohos.permission.NFC_CARD_EMULATION **原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 **参数:** | 参数名 | 类型 | 必填 | 说明 | | ----------- | ---------------------------------------- | ---- |-------------------------| | elementName | [ElementName](../apis-ability-kit/js-apis-bundle-ElementName.md#elementname) | 是 | 所属应用声明NFC卡模拟能力的页面信息(至少包含bundleName、abilityName这两项的赋值),不可以为空。 | | type | [CardType](#cardtype9) | 是 | 卡模拟业务类型。目前只支持默认支付应用查询。 | **错误码**: 以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。 | 错误码ID | 错误信息 | | -------- | ---------------------------- | |201 | Permission denied. | |401 | The parameter check failed. Possible causes:
1. Mandatory parameters are left unspecified.
2. Incorrect parameters types.
3. Parameter verification failed. | |801 | Capability not supported. | **返回值:** | **类型** | **说明** | | ------- | ------------------------------------ | | boolean | true: 是默认支付应用, false: 不是默认支付应用。 | **示例:** ```js import { cardEmulation } from '@kit.ConnectivityKit'; import { bundleManager, Want } from '@kit.AbilityKit'; // init elementName here, bundleName and abilityName are required. let want: Want = { bundleName: "com.example.myapplication", moduleName: "entry", abilityName: "EntryAbility" }; let elementName: bundleManager.ElementName = { bundleName: "com.example.myapplication", moduleName: "entry", abilityName: "EntryAbility" }; let isDefaultService: boolean = cardEmulation.isDefaultService(elementName, cardEmulation.CardType.PAYMENT); // do something according to the isDefaultService value ``` ## HceService8+ 提供HCE卡模拟的实现,主要包括接收对端读卡设备的APDU数据,并响应APDU数据到对端读卡设备。使用HCE相关接口前,必须先判断设备是否支持HCE卡模拟能力。 ### startHCE(deprecated) startHCE(aidList: string[]): boolean 启动HCE业务功能。包括设置当前应用为前台优先,动态注册AID列表。 > **说明:** > 从 API version 8 开始支持,从 API version 9 开始废弃,建议使用[start](#start9)替代。 **需要权限:** ohos.permission.NFC_CARD_EMULATION **系统能力:** SystemCapability.Communication.NFC.CardEmulation **参数:** | 参数名 | 类型 | 必填 | 说明 | | ------- | -------- | ---- | ----------------------- | | aidList | string[] | 是 | 动态注册卡模拟的AID列表。 | **返回值:** | **类型** | **说明** | | ------- | -------------------------------------- | | boolean | true: 启动HCE功能或HCE已启动, false: 启动失败。 | ### start9+ start(elementName: [ElementName](../apis-ability-kit/js-apis-bundle-ElementName.md#elementname), aidList: string[]): void 启动HCE业务功能。包括设置当前应用为前台优先,动态注册AID列表。 **需要权限:** ohos.permission.NFC_CARD_EMULATION **系统能力:** SystemCapability.Communication.NFC.CardEmulation **原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 **参数:** | 参数名 | 类型 | 必填 | 说明 | | ------- | -------- | ---- | ----------------------- | | elementName | [ElementName](../apis-ability-kit/js-apis-bundle-ElementName.md#elementname) | 是 | 所属应用声明NFC卡模拟能力的页面信息(至少包含bundleName、abilityName这两项的赋值),不可以为空。 | | aidList | string[] | 是 | 动态注册卡模拟的AID列表,允许为空。 | **错误码:** 以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。 | 错误码ID | 错误信息| | ------- | -------| |201 | Permission denied. | |401 | The parameter check failed. Possible causes:
1. Mandatory parameters are left unspecified.
2. Incorrect parameters types.
3. Parameter verification failed. | |801 | Capability not supported. | | 3100301 | Card emulation running state is abnormal in service. | ### stopHCE(deprecated) stopHCE(): boolean 停止HCE业务功能。包括退出当前应用前台优先,释放动态注册的AID列表,释放hceCmd的订阅。 > **说明:** > 从 API version 8 开始支持,从 API version 9 开始废弃,建议使用[stop](#stop9)替代。 **需要权限:** ohos.permission.NFC_CARD_EMULATION **系统能力:** SystemCapability.Communication.NFC.CardEmulation **返回值:** | **类型** | **说明** | | ------- | -------------------------------------- | | boolean | true: 禁用HCE功能或HCE已禁用, false: 禁用失败。 | **示例:** 示例请参见[on](#on8)接口的示例。 ### stop9+ stop(elementName: [ElementName](../apis-ability-kit/js-apis-bundleManager-elementName.md#elementname)): void 停止HCE业务功能。包括取消APDU数据接收的订阅,退出当前应用前台优先,释放动态注册的AID列表。应用程序需要在HCE卡模拟页面的onDestroy函数里调用该接口。 **需要权限:** ohos.permission.NFC_CARD_EMULATION **系统能力:** SystemCapability.Communication.NFC.CardEmulation **原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 **参数:** | 参数名 | 类型 | 必填 | 说明 | | ------- | -------- | ---- | ----------------------- | | elementName | [ElementName](../apis-ability-kit/js-apis-bundle-ElementName.md#elementname) | 是 | 所属应用声明NFC卡模拟能力的页面信息(至少包含bundleName、abilityName这两项的赋值),不可以为空。 | **错误码:** 以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。 | 错误码ID | 错误信息| | ------- | -------| |201 | Permission denied. | |401 | The parameter check failed. Possible causes:
1. Mandatory parameters are left unspecified.
2. Incorrect parameters types.
3. Parameter verification failed. | |801 | Capability not supported. | | 3100301 | Card emulation running state is abnormal in service. | ### on8+ on(type: 'hceCmd', callback: AsyncCallback\): void 订阅回调,用于接收对端读卡设备发送的APDU数据。应用程序需要在HCE卡模拟页面的onCreate函数里面调用该订阅函数。 **需要权限:** ohos.permission.NFC_CARD_EMULATION **系统能力:** SystemCapability.Communication.NFC.CardEmulation **原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 **参数:** | 参数名 | 类型 | 必填 | 说明 | | -------- | ----------------------- | ---- | -------------------------------------------- | | type | string | 是 | 要订阅的回调类型,固定填"hceCmd"字符串。 | | callback | AsyncCallback\ | 是 | 订阅的事件回调,入参是符合APDU协议的数据,每个number十六进制表示,范围是0x00~0xFF。 | **示例:** ```js import { hilog } from '@kit.PerformanceAnalysisKit'; import { cardEmulation } from '@kit.ConnectivityKit'; import { AsyncCallback } from '@kit.BasicServicesKit'; import { ElementName } from './bundleManager/ElementName' import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; let hceService: cardEmulation.HceService = new cardEmulation.HceService(); let element: ElementName; export default class EntryAbility extends UIAbility { onCreate(want: Want, param: AbilityConstant.LaunchParam) { hilog.info(0x0000, 'testHce', '%{public}s', 'Ability onCreate'); element = { bundleName: want.bundleName ?? '', abilityName: want.abilityName ?? '', moduleName: want.moduleName } const apduCallback: AsyncCallback = (err, data) => { //handle the data and err console.log("got apdu data"); }; hceService.on('hceCmd', apduCallback); } onDestroy() { hilog.info(0x0000, 'testHce', '%{public}s', 'Ability onDestroy'); hceService.stop(element) } // other life cycle method... } ``` ### sendResponse(deprecated) sendResponse(responseApdu: number[]): void 发送APDU数据到对端读卡设备。 > **说明:** > 从 API version 8 开始支持,从 API version 9 开始废弃,建议使用[transmit](#transmit9)替代。 **需要权限:** ohos.permission.NFC_CARD_EMULATION **系统能力:** SystemCapability.Communication.NFC.CardEmulation **参数:** | 参数名 | 类型 | 必填 | 说明 | | ------------ | -------- | ---- | -------------------------------------------------- | | responseApdu | number[] | 是 | 发送到对端读卡设备的符合APDU协议的数据,每个number十六进制表示,范围是0x00~0xFF。 | ### transmit9+ transmit(response: number[]): Promise\ 发送APDU数据到对端读卡设备,使用Promise异步回调。应用程序必须在[on](#on8)收到读卡设备发送的APDU数据后,才调用该接口响应数据。 **需要权限:** ohos.permission.NFC_CARD_EMULATION **系统能力:** SystemCapability.Communication.NFC.CardEmulation **原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 **参数:** | 参数名 | 类型 | 必填 | 说明 | | ------------ | -------- | ---- | -------------------------------------------------- | | response | number[] | 是 | 发送到对端读卡设备的符合APDU协议的数据,每个number十六进制表示,范围是0x00~0xFF。 | **返回值:** | **类型** | **说明** | | ------- | -------------------------------------- | | Promise\ | 以Promise形式异步返回发送APDU数据的结果。 | **错误码:** 以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。 | 错误码ID | 错误信息| | ------- | -------| |201 | Permission denied. | |401 | The parameter check failed. Possible causes:
1. Mandatory parameters are left unspecified.
2. Incorrect parameters types.
3. Parameter verification failed. | |801 | Capability not supported. | | 3100301 | Card emulation running state is abnormal in service. | **示例:** ```js import { cardEmulation } from '@kit.ConnectivityKit'; import { BusinessError } from '@kit.BasicServicesKit'; let hceService: cardEmulation.HceService = new cardEmulation.HceService(); // the data app wanna send, just a example data const responseData = [0x1, 0x2]; hceService.transmit(responseData).then(() => { // handle the transmit promise console.log("transmit Promise success."); }).catch((err: BusinessError) => { console.log("transmit Promise error:", err); }); ``` ### transmit9+ transmit(response: number[], callback: AsyncCallback\): void 发送APDU数据到对端读卡设备,使用Callback异步回调。应用程序必须在[on](#on8)收到读卡设备发送的APDU数据后,才调用该接口响应数据。 **需要权限:** ohos.permission.NFC_CARD_EMULATION **系统能力:** SystemCapability.Communication.NFC.CardEmulation **原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 **参数:** | 参数名 | 类型 | 必填 | 说明 | | ------- | -------- | ---- | ----------------------- | | response | number[] | 是 | 发送到对端读卡设备的符合APDU协议的数据,每个number十六进制表示,范围是0x00~0xFF。 | | callback | AsyncCallback\ | 是 | 以callback形式异步返回发送APDU数据的结果。 | **错误码:** 以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。 | 错误码ID | 错误信息| | ------- | -------| |201 | Permission denied. | |401 | The parameter check failed. Possible causes:
1. Mandatory parameters are left unspecified.
2. Incorrect parameters types.
3. Parameter verification failed. | |801 | Capability not supported. | | 3100301 | Card emulation running state is abnormal in service. | **示例:** ```js import { cardEmulation } from '@kit.ConnectivityKit'; import { BusinessError } from '@kit.BasicServicesKit'; let hceService: cardEmulation.HceService = new cardEmulation.HceService(); // the data app wanna send, just a example data try { const responseData = [0x1, 0x2]; hceService.transmit(responseData, (err : BusinessError)=> { if (err) { console.error(`transmit AsyncCallback err Code: ${err.code}, message: ${err.message}`); } else { console.log("transmit AsyncCallback success."); } }); } catch (error) { console.error(`transmit AsyncCallback catch Code: ${(error as BusinessError).code}, ` + `message: ${(error as BusinessError).message}`); } ```