鸿蒙学习实战之路-Share Kit系列(9/17)-共享联系人到分享推荐区
最近好多朋友问我:“西兰花啊,我想在分享面板里显示最近联系的人,让用户一步分享给指定联系人,但不知道代码怎么写?” 害,这问题可问对人了!今天这篇,我就手把手带你实现共享联系人到分享推荐区功能,从零到一,全程不超过 5 分钟(不含调试时间)~
鸿蒙学习实战之路-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 | 联系人电话 |
| 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%');
}
}
🥦 西兰花小贴士:
根据分享内容动态共享联系人,可以让推荐更精准。比如分享工作相关的内容,就推荐同事;分享生活相关的内容,就推荐朋友和家人。
什么时候需要共享联系人?
以下场景可能需要共享联系人:
- 社交类应用:推荐最近联系的人,让用户快速分享
- 电商类应用:推荐最近购买的联系人,让用户快速分享商品
- 内容类应用:推荐最近互动的联系人,让用户快速分享内容
- 工具类应用:推荐最近使用的联系人,让用户快速分享文件
常见问题
Q1:联系人没有显示在推荐区怎么办?
检查以下几点:
-
是否申请了权限:
- 确认是否在 module.json5 中声明了
ohos.permission.DISTRIBUTED_DATASYNC权限 - 确认是否申请了意图框架白名单
- 确认是否在 module.json5 中声明了
-
是否正确调用了 donateContact:
- 确认是否在显示分享面板前调用了
donateContact - 确认传入的联系人信息是否正确
- 确认是否在显示分享面板前调用了
Q2:如何更新联系人信息?
如果联系人信息发生变化,可以重新调用 donateContact 更新联系人信息:
// 更新联系人信息
intent.donateContact({
name: '张三',
phone: '13900139000',
email: 'zhangsan@example.com'
});
Q3:如何删除联系人信息?
Share Kit 没有提供删除联系人信息的方法,但你可以通过更新联系人信息来"删除"旧的联系人信息:
// 更新联系人信息为空
intent.donateContact({
name: '',
phone: '',
email: ''
});
下一步学什么?
看完这篇,你应该已经能共享联系人到分享推荐区了。接下来可以深入学习:
- 目标应用接入:让你的应用能接收其他应用分享的内容
- 应用内处理分享内容:UIAbility 的配置和实现
- 分享详情页处理分享内容:ShareExtensionAbility 的配置和实现
- 高级功能:碰一碰分享、隔空传送
推荐资料
📚 官方文档:
我是盐焗西兰花,
不教理论,只给你能跑的代码和避坑指南。
下期见!🥦
更多推荐




所有评论(0)