• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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: 支持该类型卡模拟,&nbsp;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,&nbsp;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: 是默认支付应用,&nbsp;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已启动,&nbsp;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已禁用,&nbsp;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