• 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    // other declared attributes.
17    "abilities": [
18      {
19        // other declared attributes.
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        // should add variable card_emulation_reason in string.json
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## cardEmulation.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](#cardemulationfeaturetypedeprecated)枚举值。 |
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// init elementName here, bundleName and abilityName are required.
204let want: Want = {
205  bundleName: "com.example.myapplication",
206  moduleName: "entry",
207  abilityName: "EntryAbility"
208};
209let elementName: bundleManager.ElementName = {
210  bundleName: "com.example.myapplication",
211  moduleName: "entry",
212  abilityName: "EntryAbility"
213};
214
215let isDefaultService: boolean = cardEmulation.isDefaultService(elementName, cardEmulation.CardType.PAYMENT);
216// do something according to the isDefaultService value
217```
218
219
220## HceService<sup>8+</sup>
221
222提供HCE卡模拟的实现,主要包括接收对端读卡设备的APDU数据,并响应APDU数据到对端读卡设备。使用HCE相关接口前,必须先判断设备是否支持HCE卡模拟能力。
223
224### startHCE<sup>(deprecated)</sup>
225
226startHCE(aidList: string[]): boolean
227
228启动HCE业务功能。包括设置当前应用为前台优先,动态注册AID列表。
229
230> **说明:**
231> 从 API version 8 开始支持,从 API version 9 开始废弃,建议使用[start](#start9)替代。
232
233**需要权限:** ohos.permission.NFC_CARD_EMULATION
234
235**系统能力:** SystemCapability.Communication.NFC.CardEmulation
236
237**参数:**
238
239| 参数名  | 类型     | 必填 | 说明                    |
240| ------- | -------- | ---- | ----------------------- |
241| aidList | string[] | 是   | 动态注册卡模拟的AID列表。 |
242
243**返回值:**
244
245| **类型**  | **说明**                                 |
246| ------- | -------------------------------------- |
247| boolean | true: 启动HCE功能或HCE已启动,&nbsp;false: 启动失败。 |
248
249### start<sup>9+</sup>
250
251start(elementName: [ElementName](../apis-ability-kit/js-apis-bundleManager-elementName.md#elementname), aidList: string[]): void
252
253启动HCE业务功能。包括设置当前应用为前台优先,动态注册AID列表。
254
255**需要权限:** ohos.permission.NFC_CARD_EMULATION
256
257**系统能力:** SystemCapability.Communication.NFC.CardEmulation
258
259**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
260
261**参数:**
262
263| 参数名  | 类型     | 必填 | 说明                    |
264| ------- | -------- | ---- | ----------------------- |
265| elementName | [ElementName](../apis-ability-kit/js-apis-bundleManager-elementName.md#elementname) | 是   | 所属应用声明NFC卡模拟能力的页面信息(至少包含bundleName、abilityName这两项的赋值),不可以为空。 |
266| aidList | string[] | 是   | 动态注册卡模拟的AID列表,允许为空。 |
267
268**错误码:**
269
270以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。
271
272| 错误码ID | 错误信息|
273| ------- | -------|
274|201 | Permission denied.                 |
275|401 | The parameter check failed. Possible causes: <br>1. Mandatory parameters are left unspecified.<br>2. Incorrect parameters types.<br>3. Parameter verification failed. |
276|801 | Capability not supported.          |
277| 3100301 | Card emulation running state is abnormal in service. |
278
279### stopHCE<sup>(deprecated)</sup>
280
281stopHCE(): boolean
282
283停止HCE业务功能。包括退出当前应用前台优先,释放动态注册的AID列表,释放hceCmd的订阅。
284
285> **说明:**
286> 从 API version 8 开始支持,从 API version 9 开始废弃,建议使用[stop](#stop9)替代。
287
288**需要权限:** ohos.permission.NFC_CARD_EMULATION
289
290**系统能力:** SystemCapability.Communication.NFC.CardEmulation
291
292**返回值:**
293
294| **类型**  | **说明**                                 |
295| ------- | -------------------------------------- |
296| boolean | true: 禁用HCE功能或HCE已禁用,&nbsp;false: 禁用失败。 |
297
298**示例:**
299
300示例请参见[on](#on8)接口的示例。
301
302### stop<sup>9+</sup>
303
304stop(elementName: [ElementName](../apis-ability-kit/js-apis-bundleManager-elementName.md#elementname)): void
305
306停止HCE业务功能。包括取消APDU数据接收的订阅,退出当前应用前台优先,释放动态注册的AID列表。应用程序需要在HCE卡模拟页面的onDestroy函数里调用该接口。
307
308**需要权限:** ohos.permission.NFC_CARD_EMULATION
309
310**系统能力:** SystemCapability.Communication.NFC.CardEmulation
311
312**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
313
314**参数:**
315
316| 参数名  | 类型     | 必填 | 说明                    |
317| ------- | -------- | ---- | ----------------------- |
318| elementName | [ElementName](../apis-ability-kit/js-apis-bundleManager-elementName.md#elementname) | 是   | 所属应用声明NFC卡模拟能力的页面信息(至少包含bundleName、abilityName这两项的赋值),不可以为空。 |
319
320**错误码:**
321
322以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。
323
324| 错误码ID | 错误信息|
325| ------- | -------|
326|201 | Permission denied.                 |
327|401 | The parameter check failed. Possible causes: <br>1. Mandatory parameters are left unspecified.<br>2. Incorrect parameters types.<br>3. Parameter verification failed. |
328|801 | Capability not supported.          |
329| 3100301 | Card emulation running state is abnormal in service. |
330
331### on<sup>8+</sup>
332
333on(type: 'hceCmd', callback: AsyncCallback\<number[]>): void
334
335订阅回调,用于接收对端读卡设备发送的APDU数据。应用程序需要在HCE卡模拟页面的onCreate函数里面调用该订阅函数。
336
337**需要权限:** ohos.permission.NFC_CARD_EMULATION
338
339**系统能力:** SystemCapability.Communication.NFC.CardEmulation
340
341**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
342
343**参数:**
344
345| 参数名   | 类型                    | 必填 | 说明                                         |
346| -------- | ----------------------- | ---- | -------------------------------------------- |
347| type     | string                  | 是   | 要订阅的回调类型,固定填"hceCmd"字符串。                         |
348| callback | AsyncCallback\<number[]> | 是   | 订阅的事件回调,入参是符合APDU协议的数据,每个number十六进制表示,范围是0x00~0xFF。 |
349
350**示例:**
351```js
352import { hilog } from '@kit.PerformanceAnalysisKit';
353import { cardEmulation } from '@kit.ConnectivityKit';
354import { AsyncCallback } from '@kit.BasicServicesKit';
355import { ElementName } from './bundleManager/ElementName'
356import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
357
358let hceService: cardEmulation.HceService = new cardEmulation.HceService();
359let element: ElementName;
360
361export default class EntryAbility extends UIAbility {
362  onCreate(want: Want, param: AbilityConstant.LaunchParam) {
363    hilog.info(0x0000, 'testHce', '%{public}s', 'Ability onCreate');
364    element = {
365      bundleName: want.bundleName ?? '',
366      abilityName: want.abilityName ?? '',
367      moduleName: want.moduleName
368    }
369    const apduCallback: AsyncCallback<number[]> = (err, data) => {
370      //handle the data and err
371      console.log("got apdu data");
372    };
373    hceService.on('hceCmd', apduCallback);
374  }
375  onDestroy() {
376    hilog.info(0x0000, 'testHce', '%{public}s', 'Ability onDestroy');
377    hceService.stop(element)
378  }
379  // other life cycle method...
380}
381```
382
383
384### sendResponse<sup>(deprecated)</sup>
385
386sendResponse(responseApdu: number[]): void
387
388发送APDU数据到对端读卡设备。
389
390> **说明:**
391> 从 API version 8 开始支持,从 API version 9 开始废弃,建议使用[transmit](#transmit9)替代。
392
393**需要权限:** ohos.permission.NFC_CARD_EMULATION
394
395**系统能力:** SystemCapability.Communication.NFC.CardEmulation
396
397**参数:**
398
399| 参数名       | 类型     | 必填 | 说明                                               |
400| ------------ | -------- | ---- | -------------------------------------------------- |
401| responseApdu | number[] | 是   | 发送到对端读卡设备的符合APDU协议的数据,每个number十六进制表示,范围是0x00~0xFF。 |
402
403### transmit<sup>9+</sup>
404
405transmit(response: number[]): Promise\<void>
406
407发送APDU数据到对端读卡设备,使用Promise异步回调。应用程序必须在[on](#on8)收到读卡设备发送的APDU数据后,才调用该接口响应数据。
408
409**需要权限:** ohos.permission.NFC_CARD_EMULATION
410
411**系统能力:** SystemCapability.Communication.NFC.CardEmulation
412
413**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
414
415**参数:**
416
417| 参数名       | 类型     | 必填 | 说明                                               |
418| ------------ | -------- | ---- | -------------------------------------------------- |
419| response | number[] | 是   | 发送到对端读卡设备的符合APDU协议的数据,每个number十六进制表示,范围是0x00~0xFF。 |
420
421**返回值:**
422
423| **类型**  | **说明**                                 |
424| ------- | -------------------------------------- |
425| Promise\<void> | 以Promise形式异步返回发送APDU数据的结果。 |
426
427**错误码:**
428
429以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。
430
431| 错误码ID | 错误信息|
432| ------- | -------|
433|201 | Permission denied.                 |
434|401 | The parameter check failed. Possible causes: <br>1. Mandatory parameters are left unspecified.<br>2. Incorrect parameters types.<br>3. Parameter verification failed. |
435|801 | Capability not supported.          |
436| 3100301 | Card emulation running state is abnormal in service. |
437
438**示例:**
439```js
440import { cardEmulation } from '@kit.ConnectivityKit';
441import { BusinessError } from '@kit.BasicServicesKit';
442
443let hceService: cardEmulation.HceService = new cardEmulation.HceService();
444
445// the data app wanna send, just a example data
446const responseData = [0x1, 0x2];
447hceService.transmit(responseData).then(() => {
448  // handle the transmit promise
449  console.log("transmit Promise success.");
450}).catch((err: BusinessError) => {
451  console.log("transmit Promise error:", err);
452});
453```
454
455### transmit<sup>9+</sup>
456
457transmit(response: number[], callback: AsyncCallback\<void>): void
458
459发送APDU数据到对端读卡设备,使用Callback异步回调。应用程序必须在[on](#on8)收到读卡设备发送的APDU数据后,才调用该接口响应数据。
460
461**需要权限:** ohos.permission.NFC_CARD_EMULATION
462
463**系统能力:** SystemCapability.Communication.NFC.CardEmulation
464
465**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
466
467**参数:**
468
469| 参数名  | 类型     | 必填 | 说明                    |
470| ------- | -------- | ---- | ----------------------- |
471| response | number[] | 是   | 发送到对端读卡设备的符合APDU协议的数据,每个number十六进制表示,范围是0x00~0xFF。 |
472| callback | AsyncCallback\<void> | 是   | 以callback形式异步返回发送APDU数据的结果。 |
473
474**错误码:**
475
476以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。
477
478| 错误码ID | 错误信息|
479| ------- | -------|
480|201 | Permission denied.                 |
481|401 | The parameter check failed. Possible causes: <br>1. Mandatory parameters are left unspecified.<br>2. Incorrect parameters types.<br>3. Parameter verification failed. |
482|801 | Capability not supported.          |
483| 3100301 | Card emulation running state is abnormal in service. |
484
485**示例:**
486```js
487import { cardEmulation } from '@kit.ConnectivityKit';
488import { BusinessError } from '@kit.BasicServicesKit';
489
490let hceService: cardEmulation.HceService = new cardEmulation.HceService();
491
492// the data app wanna send, just a example data
493try {
494  const responseData = [0x1, 0x2];
495
496  hceService.transmit(responseData, (err : BusinessError)=> {
497    if (err) {
498      console.error(`transmit AsyncCallback err Code: ${err.code}, message: ${err.message}`);
499    } else {
500      console.log("transmit AsyncCallback success.");
501    }
502  });
503} catch (error) {
504  console.error(`transmit AsyncCallback catch Code: ${(error as BusinessError).code}, ` +
505    `message: ${(error as BusinessError).message}`);
506}
507```
508
509