在鸿蒙全场景生态中,联系人数据的跨设备、跨应用流转是社交互联的刚需场景。HarmonyOS NEXT 6.1.0 (API 23) 在 Telephony Kit 中新增了原生 VCard 模块(@ohos.telephony.vcard),提供标准 vcf 文件的导入导出能力,彻底解决了跨端中文乱码和格式不统一的问题。本文从开发者视角拆解该模块的核心 API、设备能力差异、权限管控,并给出可复用的防御式编码方案。
一、核心 API 能力说明
1. importVCard 接口:将指定路径下的 .vcf 文件解析并写入联系人数据库。
- 异步形式:vcard.importVCard(context, filePath, accountId, callback) / Promise。
- 参数:context 为 UIAbilityContext;filePath 为 vcf 文件绝对路径;accountId 可选,默认0。
- 所需权限:ohos.permission.WRITE_CONTACTS 和 ohos.permission.READ_CONTACTS。
2. exportVCard 接口:基于 DataSharePredicates 条件查询联系人并序列化为标准 vcf 文件。
- 异步形式:vcard.exportVCard(context, predicates, options?) → Promise<string>。
- 参数:predicates 来自 @kit.ArkData,可链式构造查询条件(如 equalTo('NAME','Rose'));options 为 VCardBuilderOptions,包含 cardType(VCardType.VERSION_21/30/40)和 charset(如 UTF-8/GBK)。
- 返回值:字符串,为生成的 vcf 文件绝对路径。
二、设备能力差异与防御式拦截
VCard 模块依赖 SystemCapability.Telephony.CoreService,因此仅在具备蜂窝或常规通讯能力的设备上可用:Phone、Tablet、Wearable。PC/2in1、TV 等平台物理屏蔽该系统能力,若强行调用会抛 BusinessError - Code: 8300003。
开发者必须在调用前进行平台检测,避免运行时崩溃。建议使用 canIUse 或 @ohos.bundle.innerBundleManager 查询系统能力是否就绪,或直接捕获异常并降级处理。
三、实战代码:安全的导入导出流程
以下示例用 ArkTS 仿真了带平台检测和权限拦截的 VCard 导入导出逻辑。
- import { vcard } from '@kit.TelephonyKit';
- import { dataSharePredicates } from '@kit.ArkData';
- import { BusinessError } from '@kit.BasicServicesKit';
- @Entry
- @Component
- struct VCardDemo {
- @State devicePlatform: string = 'Phone'; // 可通过系统API获取
- @State hasContactsPermission: boolean = true; // 实际需通过@ohos.abilityAccessCtrl校验
-
- // 导入VCard
- async importVCard(context: Context, filePath: string, accountId?: number) {
- if (this.devicePlatform === 'PC' || this.devicePlatform === 'TV') {
- console.error('Platform not support Telephony CoreService');
- return;
- }
- if (!this.hasContactsPermission) {
- console.error('No WRITE_CONTACTS permission');
- return;
- }
- try {
- await vcard.importVCard(context, filePath, accountId);
- console.info('Import success');
- } catch (err) {
- let code = (err as BusinessError).code;
- if (code === 8300003) {
- console.error('System capability not ready');
- } else if (code === 201) {
- console.error('Permission denied');
- }
- }
- }
- // 导出联系人(按姓名匹配)
- async exportVCard(context: Context) {
- if (!this.hasContactsPermission) {
- console.error('No READ_CONTACTS permission');
- return;
- }
- let predicates = new dataSharePredicates.DataSharePredicates();
- predicates.equalTo('NAME', 'Rose');
- let options: vcard.VCardBuilderOptions = {
- cardType: vcard.VCardType.VERSION_30,
- charset: 'UTF-8'
- };
- try {
- let filePath = await vcard.exportVCard(context, predicates, options);
- console.info('Exported vcf path: ' + filePath);
- } catch (err) {
- // 处理错误
- }
- }
- }
复制代码
四、总结
HarmonyOS NEXT 的 VCard 模块提供了标准化的联系人互操作能力,但开发者需注意设备差异和权限管控。建议在调用前校验平台能力(可使用 canIUse('SystemCapability.Telephony.CoreService') 或 @ohos.bundle.bundleInfo),并捕获 BusinessError 进行降级。字符集建议统一为 UTF-8 以减少乱码。该模块在不同设备间的底座已拉齐,为穿戴设备与手持设备间的社交互联提供了坚实底座。 |