鸿蒙学习实战之路-Share Kit系列(9/17)-共享联系人到分享推荐区

最近好多朋友问我:“西兰花啊,我想在分享面板里显示最近联系的人,让用户一步分享给指定联系人,但不知道代码怎么写?” 害,这问题可问对人了!

今天这篇,我就手把手带你实现共享联系人到分享推荐区功能,从零到一,全程不超过 5 分钟(不含调试时间)~


共享联系人是啥?

共享联系人就是把你的应用中的联系人信息"捐献"给意图框架,让分享面板的推荐区显示这些联系人。用户可以直接选择联系人,一步分享给指定的人。

这就像微信分享时,推荐区会显示最近联系的人,用户可以直接选择,不用再去找人。


需要申请权限吗?

是的,共享联系人需要申请 ohos.permission.DISTRIBUTED_DATASYNC 权限,并且需要申请意图框架白名单。

配置权限

module.json5 中声明权限:

{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.DISTRIBUTED_DATASYNC"
      }
    ]
  }
}

🥦 西兰花警告
我有个朋友忘记申请权限,结果联系人一直不显示,debug 了两小时才发现是权限问题!血泪教训啊朋友们!


如何共享联系人?

Share Kit 提供了 intent.donateContact 方法,可以共享联系人信息。

完整代码示例

import { common } from '@kit.AbilityKit';
import { intent } from '@kit.IntentKit';
import { systemShare } from '@kit.ShareKit';

// 步骤1:捐献联系人信息
intent.donateContact({
  name: '张三',
  phone: '13800138000',
  email: 'zhangsan@example.com'
});

// 步骤2:构造分享数据
let shareData: systemShare.SharedData = new systemShare.SharedData({
  utd: 'general.text',
  uri: 'file://.../xxx.txt',
  title: '分享文本',
  preview: 'file://.../preview.jpg',
  description: '这是一段分享文本'
});

// 步骤3:构建分享控制器
let controller: systemShare.ShareController = new systemShare.ShareController(shareData);

// 步骤4:显示分享面板
let uiContext: UIContext = this.getUIContext();
let context: common.UIAbilityContext = uiContext.getHostContext() as common.UIAbilityContext;

controller.show(context, {
  previewMode: systemShare.SharePreviewMode.DEFAULT,
  selectionMode: systemShare.SelectionMode.SINGLE
});

参数详解

donateContact - 捐献联系人信息

intent.donateContact 用于捐献联系人信息,参数包括:

参数 类型 说明
name string 联系人姓名
phone string 联系人电话
email string 联系人邮箱

🥦 西兰花小贴士
联系人信息是可选的,你可以只提供姓名,或者只提供电话和邮箱。但建议尽可能提供完整的信息,这样推荐更精准。


在实际项目中怎么用?

上面的代码是基础实现,但在实际项目中,你可能会这样用:

示例:分享给最近联系人

import { common } from '@kit.AbilityKit';
import { intent } from '@kit.IntentKit';
import { systemShare } from '@kit.ShareKit';

@Entry
@Component
struct ShareContactPage {
  // 分享文本
  shareText: string = '这是一段分享文本';

  // 最近联系人列表
  recentContacts: Array<{ name: string, phone: string, email: string }> = [
    { name: '张三', phone: '13800138000', email: 'zhangsan@example.com' },
    { name: '李四', phone: '13900139000', email: 'lisi@example.com' },
    { name: '王五', phone: '13700137000', email: 'wangwu@example.com' }
  ];

  // 分享文本(共享最近联系人)
  onShareTextWithContacts() {
    // 捐献最近联系人信息
    this.recentContacts.forEach(contact => {
      intent.donateContact(contact);
    });

    // 构造分享数据
    let shareData: systemShare.SharedData = new systemShare.SharedData({
      utd: 'general.text',
      uri: 'file://.../xxx.txt',
      title: '分享文本',
      description: this.shareText
    });

    // 构建分享控制器
    let controller: systemShare.ShareController = new systemShare.ShareController(shareData);

    // 显示分享面板
    let uiContext: UIContext = this.getUIContext();
    let context: common.UIAbilityContext = uiContext.getHostContext() as common.UIAbilityContext;

    controller.show(context, {
      previewMode: systemShare.SharePreviewMode.DEFAULT,
      selectionMode: systemShare.SelectionMode.SINGLE
    });
  }

  build() {
    Column() {
      Text('共享联系人到分享推荐区示例')
        .fontSize(20)
        .fontWeight(FontWeight.Bold)
        .margin(20)
        .fontColor(Color.Black);

      Text(this.shareText)
        .fontSize(16)
        .margin({ left: 20, right: 20, bottom: 20 })
        .fontColor(Color.Gray);

      Button('分享文本(共享最近联系人)')
        .onClick(() => {
          this.onShareTextWithContacts();
        })
        .margin(20);
    }
    .width('100%')
    .height('100%');
  }
}

示例:根据分享内容动态共享联系人

import { common } from '@kit.AbilityKit';
import { intent } from '@kit.IntentKit';
import { systemShare } from '@kit.ShareKit';

@Entry
@Component
struct DynamicContactPage {
  // 分享文本
  shareText: string = '这是一段分享文本';

  // 联系人列表
  contacts: Array<{ name: string, phone: string, email: string, tags: string[] }> = [
    { name: '张三', phone: '13800138000', email: 'zhangsan@example.com', tags: ['朋友', '同事'] },
    { name: '李四', phone: '13900139000', email: 'lisi@example.com', tags: ['家人'] },
    { name: '王五', phone: '13700137000', email: 'wangwu@example.com', tags: ['同事'] }
  ];

  // 根据分享内容动态共享联系人
  onShareTextWithDynamicContacts() {
    // 根据分享内容选择合适的联系人
    let selectedContacts = this.contacts.filter(contact => {
      return contact.tags.includes('同事');
    });

    // 捐献选中的联系人信息
    selectedContacts.forEach(contact => {
      intent.donateContact(contact);
    });

    // 构造分享数据
    let shareData: systemShare.SharedData = new systemShare.SharedData({
      utd: 'general.text',
      uri: 'file://.../xxx.txt',
      title: '分享文本',
      description: this.shareText
    });

    // 构建分享控制器
    let controller: systemShare.ShareController = new systemShare.ShareController(shareData);

    // 显示分享面板
    let uiContext: UIContext = this.getUIContext();
    let context: common.UIAbilityContext = uiContext.getHostContext() as common.UIAbilityContext;

    controller.show(context, {
      previewMode: systemShare.SharePreviewMode.DEFAULT,
      selectionMode: systemShare.SelectionMode.SINGLE
    });
  }

  build() {
    Column() {
      Text('根据分享内容动态共享联系人示例')
        .fontSize(20)
        .fontWeight(FontWeight.Bold)
        .margin(20)
        .fontColor(Color.Black);

      Text(this.shareText)
        .fontSize(16)
        .margin({ left: 20, right: 20, bottom: 20 })
        .fontColor(Color.Gray);

      Button('分享文本(动态共享联系人)')
        .onClick(() => {
          this.onShareTextWithDynamicContacts();
        })
        .margin(20);
    }
    .width('100%')
    .height('100%');
  }
}

🥦 西兰花小贴士
根据分享内容动态共享联系人,可以让推荐更精准。比如分享工作相关的内容,就推荐同事;分享生活相关的内容,就推荐朋友和家人。


什么时候需要共享联系人?

以下场景可能需要共享联系人:

  1. 社交类应用:推荐最近联系的人,让用户快速分享
  2. 电商类应用:推荐最近购买的联系人,让用户快速分享商品
  3. 内容类应用:推荐最近互动的联系人,让用户快速分享内容
  4. 工具类应用:推荐最近使用的联系人,让用户快速分享文件

常见问题

Q1:联系人没有显示在推荐区怎么办?

检查以下几点:

  1. 是否申请了权限

    • 确认是否在 module.json5 中声明了 ohos.permission.DISTRIBUTED_DATASYNC 权限
    • 确认是否申请了意图框架白名单
  2. 是否正确调用了 donateContact

    • 确认是否在显示分享面板前调用了 donateContact
    • 确认传入的联系人信息是否正确

Q2:如何更新联系人信息?

如果联系人信息发生变化,可以重新调用 donateContact 更新联系人信息:

// 更新联系人信息
intent.donateContact({
  name: '张三',
  phone: '13900139000',
  email: 'zhangsan@example.com'
});

Q3:如何删除联系人信息?

Share Kit 没有提供删除联系人信息的方法,但你可以通过更新联系人信息来"删除"旧的联系人信息:

// 更新联系人信息为空
intent.donateContact({
  name: '',
  phone: '',
  email: ''
});

下一步学什么?

看完这篇,你应该已经能共享联系人到分享推荐区了。接下来可以深入学习:

  1. 目标应用接入:让你的应用能接收其他应用分享的内容
  2. 应用内处理分享内容:UIAbility 的配置和实现
  3. 分享详情页处理分享内容:ShareExtensionAbility 的配置和实现
  4. 高级功能:碰一碰分享、隔空传送

推荐资料

📚 官方文档


我是盐焗西兰花,
不教理论,只给你能跑的代码和避坑指南。
下期见!🥦

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐