1# @ohos.nfc.cardEmulation (标准NFC-cardEmulation) 2 3本模块主要提供NFC卡模拟业务,包括判断支持哪种卡模拟类型,HCE卡模拟的业务实现等。 4HCE(Host Card Emulation),称为基于主机的卡模拟,表示不依赖安全单元芯片,应用程序模拟NFC卡片,可以通过NFC服务和NFC读卡器通信。 5 6> **说明:** 7> 8> 本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 9 10## HCE卡模拟和AID列表的声明定义 11 12开发HCE卡模拟相关应用时,需要在应用的属性配置文件中,声明与NFC相关的属性值,比如,在module.json5文件中,声明下面属性值: 13```json 14{ 15 "module": { 16 // 其他已声明的属性 17 "abilities": [ 18 { 19 // 其他已声明的属性 20 "skills": [ 21 { 22 "actions": [ 23 "ohos.nfc.cardemulation.action.HOST_APDU_SERVICE" 24 ] 25 } 26 ], 27 "metadata": [ 28 { 29 "name": "payment-aid", 30 "value": "your payment aid" 31 }, 32 { 33 "name": "other-aid", 34 "value": "your other aid" 35 } 36 ] 37 } 38 ], 39 "requestPermissions": [ 40 { 41 "name": "ohos.permission.NFC_CARD_EMULATION", 42 // 必须要添加reason: card_mulation_reason 43 "reason": "$string:card_emulation_reason", 44 } 45 ] 46 } 47} 48``` 49> **注意:** 50>1. 声明"actions"字段的内容填写,必须包含"ohos.nfc.cardemulation.action.HOST_APDU_SERVICE",不能更改。 51>2. 声明aid时,name必须为payment-aid,或者other-aid。填写错误会造成解析失败。 52>3. 声明权限时"requestPermissions"中的"name"字段的内容填写,必须是"ohos.permission.NFC_CARD_EMULATION",不能更改。 53 54## 导入模块 55 56``` 57import { cardEmulation } from '@kit.ConnectivityKit'; 58``` 59 60## FeatureType<sup>(deprecated)</sup> 61 62定义不同的NFC卡模拟类型。 63 64> **说明:** 65> 66> 从 API version 6 开始支持,从 API version 9 开始废弃,建议使用[hasHceCapability](#cardemulationhashcecapability9)替代。 67 68**系统能力:** SystemCapability.Communication.NFC.CardEmulation 69 70| 名称 | 值 | 说明 | 71| ---- | ---- | -------- | 72| HCE | 0 | HCE 卡模拟。 | 73| UICC | 1 | SIM 卡模拟。 | 74| ESE | 2 | ESE 卡模拟。 | 75 76## CardType<sup>9+</sup> 77 78定义卡模拟应用所使用的业务类型,是支付类型,还是其他类型。 79 80**系统能力:** SystemCapability.Communication.NFC.CardEmulation 81 82**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 83 84| 名称 | 值 | 说明 | 85| ------- | --------- | ----------------- | 86| PAYMENT | "payment" | 卡模拟应用所使用的业务是支付类型。 | 87| OTHER | "other" | 卡模拟应用所使用的业务是其他类型。 | 88 89## cardEmulation.isSupported<sup>(deprecated)</sup> 90 91isSupported(feature: number): boolean 92 93是否支持某种类型的卡模拟。 94 95> **说明:** 96> 97> 从 API version 6 开始支持,从 API version 9 开始废弃,建议使用[hasHceCapability](#cardemulationhashcecapability9)替代。 98 99**系统能力:** SystemCapability.Communication.NFC.CardEmulation 100 101**参数:** 102 103| 参数名 | 类型 | 必填 | 说明 | 104| ------- | ------ | ---- | ---------------------------------------- | 105| feature | number | 是 | 卡模拟类型值,详细请见[FeatureType](#featuretypedeprecated)枚举值。 | 106 107**返回值:** 108 109| **类型** | **说明** | 110| ------- | -------------------------------------- | 111| boolean | true: 支持该类型卡模拟, false: 不支持该类型卡模拟。 | 112 113**示例:** 114 115```js 116import { cardEmulation } from '@kit.ConnectivityKit'; 117 118let isHceSupported: boolean = cardEmulation.isSupported(cardEmulation.FeatureType.HCE); 119if (!isHceSupported) { 120 console.log('this device is not supported for HCE, ignore it.'); 121} 122``` 123 124## cardEmulation.hasHceCapability<sup>9+</sup> 125 126hasHceCapability(): boolean 127 128判断设备是否支持HCE卡模拟功能。 129 130**系统能力:** SystemCapability.Communication.NFC.CardEmulation 131 132**需要权限:** ohos.permission.NFC_CARD_EMULATION 133 134**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 135 136**返回值:** 137 138| **类型** | **说明** | 139| ------- | -------------------------------- | 140| boolean | true: 支持HCE, false: 不支持HCE。 | 141 142**错误码**: 143 144以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。 145 146| 错误码ID | 错误信息 | 147| -------- | ---------------------------- | 148|201 | Permission denied. | 149|801 | Capability not supported. | 150 151**示例:** 152 153```js 154import { cardEmulation } from '@kit.ConnectivityKit'; 155 156let hasHceCap: boolean = cardEmulation.hasHceCapability(); 157if (!hasHceCap) { 158 console.log('this device hasHceCapability false, ignore it.'); 159} 160``` 161 162## cardEmulation.isDefaultService<sup>9+</sup> 163 164isDefaultService(elementName: ElementName, type: CardType): boolean 165 166判断指定的应用是否为指定业务类型的默认应用。 167 168**系统能力:** SystemCapability.Communication.NFC.CardEmulation 169 170**需要权限:** ohos.permission.NFC_CARD_EMULATION 171 172**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 173 174**参数:** 175 176| 参数名 | 类型 | 必填 | 说明 | 177| ----------- | ---------------------------------------- | ---- |-------------------------| 178| elementName | [ElementName](../apis-ability-kit/js-apis-bundleManager-elementName.md#elementname) | 是 | 所属应用声明NFC卡模拟能力的页面信息(至少包含bundleName、abilityName这两项的赋值),不可以为空。 | 179| type | [CardType](#cardtype9) | 是 | 卡模拟业务类型。目前只支持默认支付应用查询。 | 180 181**错误码**: 182 183以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。 184 185| 错误码ID | 错误信息 | 186| -------- | ---------------------------- | 187|201 | Permission denied. | 188|401 | The parameter check failed. Possible causes: <br>1. Mandatory parameters are left unspecified.<br>2. Incorrect parameters types.<br>3. Parameter verification failed. | 189|801 | Capability not supported. | 190 191**返回值:** 192 193| **类型** | **说明** | 194| ------- | ------------------------------------ | 195| boolean | true: 是默认支付应用, false: 不是默认支付应用。 | 196 197 198**示例:** 199```js 200import { cardEmulation } from '@kit.ConnectivityKit'; 201import { bundleManager, Want } from '@kit.AbilityKit'; 202 203// 需要初始化 elementName、bundleName、abilityName,根据实际应用信息更改为正确的值 204let elementName: bundleManager.ElementName = { 205 bundleName: "com.example.myapplication", 206 moduleName: "entry", 207 abilityName: "EntryAbility" 208}; 209 210let isDefaultService: boolean = cardEmulation.isDefaultService(elementName, cardEmulation.CardType.PAYMENT); 211``` 212 213## HceService<sup>8+</sup> 214 215提供HCE卡模拟的实现,主要包括接收对端读卡设备的APDU数据,并响应APDU数据到对端读卡设备。使用HCE相关接口前,必须先判断设备是否支持HCE卡模拟能力。 216 217### startHCE<sup>(deprecated)</sup> 218 219startHCE(aidList: string[]): boolean 220 221启动HCE业务功能。包括设置当前应用为前台优先,动态注册AID列表。 222 223> **说明:** 224> 从 API version 8 开始支持,从 API version 9 开始废弃,建议使用[start](#start9)替代。 225 226**需要权限:** ohos.permission.NFC_CARD_EMULATION 227 228**系统能力:** SystemCapability.Communication.NFC.CardEmulation 229 230**参数:** 231 232| 参数名 | 类型 | 必填 | 说明 | 233| ------- | -------- | ---- | ----------------------- | 234| aidList | string[] | 是 | 动态注册卡模拟的AID列表。 | 235 236**返回值:** 237 238| **类型** | **说明** | 239| ------- | -------------------------------------- | 240| boolean | true: 启动HCE功能或HCE已启动, false: 启动失败。 | 241 242### start<sup>9+</sup> 243 244start(elementName: [ElementName](../apis-ability-kit/js-apis-bundleManager-elementName.md#elementname), aidList: string[]): void 245 246启动HCE业务功能。包括设置当前应用为前台优先,动态注册AID列表。 247 248**需要权限:** ohos.permission.NFC_CARD_EMULATION 249 250**系统能力:** SystemCapability.Communication.NFC.CardEmulation 251 252**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 253 254**参数:** 255 256| 参数名 | 类型 | 必填 | 说明 | 257| ------- | -------- | ---- | ----------------------- | 258| elementName | [ElementName](../apis-ability-kit/js-apis-bundleManager-elementName.md#elementname) | 是 | 所属应用声明NFC卡模拟能力的页面信息(至少包含bundleName、abilityName这两项的赋值),不可以为空。 | 259| aidList | string[] | 是 | 动态注册卡模拟的AID列表,允许为空。 | 260 261**错误码:** 262 263以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。 264 265| 错误码ID | 错误信息| 266| ------- | -------| 267|201 | Permission denied. | 268|401 | The parameter check failed. Possible causes: <br>1. Mandatory parameters are left unspecified.<br>2. Incorrect parameters types.<br>3. Parameter verification failed. | 269|801 | Capability not supported. | 270| 3100301 | Card emulation running state is abnormal in service. | 271 272### stopHCE<sup>(deprecated)</sup> 273 274stopHCE(): boolean 275 276停止HCE业务功能。包括退出当前应用前台优先,释放动态注册的AID列表,释放hceCmd的订阅。 277 278> **说明:** 279> 从 API version 8 开始支持,从 API version 9 开始废弃,建议使用[stop](#stop9)替代。 280 281**需要权限:** ohos.permission.NFC_CARD_EMULATION 282 283**系统能力:** SystemCapability.Communication.NFC.CardEmulation 284 285**返回值:** 286 287| **类型** | **说明** | 288| ------- | -------------------------------------- | 289| boolean | true: 禁用HCE功能或HCE已禁用, false: 禁用失败。 | 290 291**示例:** 292 293示例请参见[on](#on8)接口的示例。 294 295### stop<sup>9+</sup> 296 297stop(elementName: [ElementName](../apis-ability-kit/js-apis-bundleManager-elementName.md#elementname)): void 298 299停止HCE业务功能。包括取消APDU数据接收的订阅,退出当前应用前台优先,释放动态注册的AID列表。应用程序需要在HCE卡模拟页面的onDestroy函数里调用该接口。 300 301**需要权限:** ohos.permission.NFC_CARD_EMULATION 302 303**系统能力:** SystemCapability.Communication.NFC.CardEmulation 304 305**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 306 307**参数:** 308 309| 参数名 | 类型 | 必填 | 说明 | 310| ------- | -------- | ---- | ----------------------- | 311| elementName | [ElementName](../apis-ability-kit/js-apis-bundleManager-elementName.md#elementname) | 是 | 所属应用声明NFC卡模拟能力的页面信息(至少包含bundleName、abilityName这两项的赋值),不可以为空。 | 312 313**错误码:** 314 315以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。 316 317| 错误码ID | 错误信息| 318| ------- | -------| 319|201 | Permission denied. | 320|401 | The parameter check failed. Possible causes: <br>1. Mandatory parameters are left unspecified.<br>2. Incorrect parameters types.<br>3. Parameter verification failed. | 321|801 | Capability not supported. | 322| 3100301 | Card emulation running state is abnormal in service. | 323 324### on<sup>8+</sup> 325 326on(type: 'hceCmd', callback: AsyncCallback\<number[]>): void 327 328订阅回调,用于接收对端读卡设备发送的APDU数据。应用程序需要在HCE卡模拟页面的onCreate函数里面调用该订阅函数。 329 330**需要权限:** ohos.permission.NFC_CARD_EMULATION 331 332**系统能力:** SystemCapability.Communication.NFC.CardEmulation 333 334**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 335 336**参数:** 337 338| 参数名 | 类型 | 必填 | 说明 | 339| -------- | ----------------------- | ---- | -------------------------------------------- | 340| type | string | 是 | 要订阅的回调类型,固定填"hceCmd"字符串。 | 341| callback | AsyncCallback\<number[]> | 是 | 订阅的事件回调,入参是符合APDU协议的数据,每个number十六进制表示,范围是0x00~0xFF。 | 342 343**错误码:** 344 345以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。 346 347| 错误码ID | 错误信息| 348| ------- | -------| 349|201 | Permission denied. | 350|801 | Capability not supported. | 351 352**示例:** 353```js 354import { hilog } from '@kit.PerformanceAnalysisKit'; 355import { cardEmulation } from '@kit.ConnectivityKit'; 356import { AsyncCallback } from '@kit.BasicServicesKit'; 357import { ElementName } from './bundleManager/ElementName' 358import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; 359 360let hceService: cardEmulation.HceService = new cardEmulation.HceService(); 361let element: ElementName; 362 363export default class EntryAbility extends UIAbility { 364 onCreate(want: Want, param: AbilityConstant.LaunchParam) { 365 hilog.info(0x0000, 'testHce', '%{public}s', 'Ability onCreate'); 366 element = { 367 bundleName: want.bundleName ?? '', 368 abilityName: want.abilityName ?? '', 369 moduleName: want.moduleName 370 } 371 const apduCallback: AsyncCallback<number[]> = (err, data) => { 372 //处理数据和异常 373 console.log("got apdu data"); 374 }; 375 hceService.on('hceCmd', apduCallback); 376 } 377 onDestroy() { 378 hilog.info(0x0000, 'testHce', '%{public}s', 'Ability onDestroy'); 379 hceService.stop(element); 380 } 381 // 生命周期内的其它功能 382} 383``` 384 385### off<sup>18+</sup> 386 387off(type: 'hceCmd', callback?: AsyncCallback\<number[]>): void 388 389取消APDU数据接收的订阅。 390 391**需要权限:** ohos.permission.NFC_CARD_EMULATION 392 393**系统能力:** SystemCapability.Communication.NFC.CardEmulation 394 395**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。 396 397**参数:** 398 399| 参数名 | 类型 | 必填 | 说明 | 400| -------- | ----------------------- | ---- | -------------------------------------------- | 401| type | string | 是 | 要取消订阅的事件类型,固定填"hceCmd"字符串。 | 402| callback | AsyncCallback\<number[]> | 否 | 订阅的事件回调。 | 403 404**错误码:** 405 406以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。 407 408| 错误码ID | 错误信息| 409| ------- | -------| 410|201 | Permission denied. | 411|401 | Invalid parameter. | 412|801 | Capability not supported. | 413 414**示例:** 415```js 416import { hilog } from '@kit.PerformanceAnalysisKit'; 417import { cardEmulation } from '@kit.ConnectivityKit'; 418import { AsyncCallback } from '@kit.BasicServicesKit'; 419import { ElementName } from './bundleManager/ElementName' 420import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; 421 422let hceService: cardEmulation.HceService = new cardEmulation.HceService(); 423let element: ElementName; 424const apduCallback: AsyncCallback<number[]> = (err, data) => { 425 // 处理数据和异常 426 console.log("AsyncCallback got apdu data"); 427}; 428 429export default class EntryAbility extends UIAbility { 430 onCreate(want: Want, param: AbilityConstant.LaunchParam) { 431 hilog.info(0x0000, 'testHce', '%{public}s', 'Ability onCreate'); 432 element = { 433 bundleName: want.bundleName ?? '', 434 abilityName: want.abilityName ?? '', 435 moduleName: want.moduleName 436 } 437 const apduCallback: AsyncCallback<number[]> = (err, data) => { 438 // 处理数据和异常 439 console.log("got apdu data"); 440 }; 441 hceService.on('hceCmd', apduCallback); 442 } 443 onDestroy() { 444 hilog.info(0x0000, 'testHce', '%{public}s', 'Ability onDestroy'); 445 hceService.off('hceCmd', apduCallback); 446 hceService.stop(element); 447 } 448 // 生命周期内的其它功能 449} 450``` 451 452### sendResponse<sup>(deprecated)</sup> 453 454sendResponse(responseApdu: number[]): void 455 456发送APDU数据到对端读卡设备。 457 458> **说明:** 459> 从 API version 8 开始支持,从 API version 9 开始废弃,建议使用[transmit](#transmit9)替代。 460 461**需要权限:** ohos.permission.NFC_CARD_EMULATION 462 463**系统能力:** SystemCapability.Communication.NFC.CardEmulation 464 465**参数:** 466 467| 参数名 | 类型 | 必填 | 说明 | 468| ------------ | -------- | ---- | -------------------------------------------------- | 469| responseApdu | number[] | 是 | 发送到对端读卡设备的符合APDU协议的数据,每个number十六进制表示,范围是0x00~0xFF。 | 470 471### transmit<sup>9+</sup> 472 473transmit(response: number[]): Promise\<void> 474 475发送APDU数据到对端读卡设备,使用Promise异步回调。应用程序必须在[on](#on8)收到读卡设备发送的APDU数据后,才调用该接口响应数据。 476 477**需要权限:** ohos.permission.NFC_CARD_EMULATION 478 479**系统能力:** SystemCapability.Communication.NFC.CardEmulation 480 481**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 482 483**参数:** 484 485| 参数名 | 类型 | 必填 | 说明 | 486| ------------ | -------- | ---- | -------------------------------------------------- | 487| response | number[] | 是 | 发送到对端读卡设备的符合APDU协议的数据,每个number十六进制表示,范围是0x00~0xFF。 | 488 489**返回值:** 490 491| **类型** | **说明** | 492| ------- | -------------------------------------- | 493| Promise\<void> | 以Promise形式异步返回发送APDU数据的结果。 | 494 495**错误码:** 496 497以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。 498 499| 错误码ID | 错误信息| 500| ------- | -------| 501|201 | Permission denied. | 502|401 | The parameter check failed. Possible causes: <br>1. Mandatory parameters are left unspecified.<br>2. Incorrect parameters types.<br>3. Parameter verification failed. | 503|801 | Capability not supported. | 504| 3100301 | Card emulation running state is abnormal in service. | 505 506**示例:** 507```js 508import { cardEmulation } from '@kit.ConnectivityKit'; 509import { BusinessError } from '@kit.BasicServicesKit'; 510 511let hceService: cardEmulation.HceService = new cardEmulation.HceService(); 512 513// 应用程序实际想要发送的数据, 此处仅做为示例 514const responseData = [0x1, 0x2]; 515hceService.transmit(responseData).then(() => { 516 // 处理 promise 的回调 517 console.log("transmit Promise success."); 518}).catch((err: BusinessError) => { 519 console.log("transmit Promise error:", err); 520}); 521``` 522 523### transmit<sup>9+</sup> 524 525transmit(response: number[], callback: AsyncCallback\<void>): void 526 527发送APDU数据到对端读卡设备,使用Callback异步回调。应用程序必须在[on](#on8)收到读卡设备发送的APDU数据后,才调用该接口响应数据。 528 529**需要权限:** ohos.permission.NFC_CARD_EMULATION 530 531**系统能力:** SystemCapability.Communication.NFC.CardEmulation 532 533**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 534 535**参数:** 536 537| 参数名 | 类型 | 必填 | 说明 | 538| ------- | -------- | ---- | ----------------------- | 539| response | number[] | 是 | 发送到对端读卡设备的符合APDU协议的数据,每个number十六进制表示,范围是0x00~0xFF。 | 540| callback | AsyncCallback\<void> | 是 | 以callback形式异步返回发送APDU数据的结果。 | 541 542**错误码:** 543 544以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。 545 546| 错误码ID | 错误信息| 547| ------- | -------| 548|201 | Permission denied. | 549|401 | The parameter check failed. Possible causes: <br>1. Mandatory parameters are left unspecified.<br>2. Incorrect parameters types.<br>3. Parameter verification failed. | 550|801 | Capability not supported. | 551| 3100301 | Card emulation running state is abnormal in service. | 552 553**示例:** 554```js 555import { cardEmulation } from '@kit.ConnectivityKit'; 556import { BusinessError } from '@kit.BasicServicesKit'; 557 558let hceService: cardEmulation.HceService = new cardEmulation.HceService(); 559 560// 应用程序实际想要发送的数据, 此处仅做为示例 561try { 562 const responseData = [0x1, 0x2]; 563 564 hceService.transmit(responseData, (err : BusinessError)=> { 565 if (err) { 566 console.error(`transmit AsyncCallback err Code: ${err.code}, message: ${err.message}`); 567 } else { 568 console.log("transmit AsyncCallback success."); 569 } 570 }); 571} catch (error) { 572 console.error(`transmit AsyncCallback catch Code: ${(error as BusinessError).code}, ` + 573 `message: ${(error as BusinessError).message}`); 574} 575``` 576 577