HarmonyOS的Share Kit是实现跨设备、跨应用数据共享的核心能力,支持文本、图片、音频等多种格式的无缝传输。本文将通过设备间文件分享和应用间文件分享两个场景,结合代码示例,详解如何快速实现HarmonyOS原生分享功能。
一、设备间基于Share Kit分享文件
1.1 实现步骤
1. 导入模块
import { systemShare } from '@system.share'; // 分享核心模块
import { uniformTypeDescriptor as utd } from '@system.data'; // 数据类型描述模块
import { common } from '@system.ability'; // 能力模块
2. 构造分享数据
// 创建ShareData对象
let data = new systemShare.SharedData({
utd: utd.UniformDataType.PLAIN_TEXT, // 文本类型
content: 'Hello HarmonyOS!' // 分享文本内容
});
// 添加图片记录(支持多条记录)
data.addRecord({
utd: utd.UniformDataType.PNG, // PNG图片类型
uri: 'file:///storage/self/0/pictures/test.png' // 文件路径
});
3. 显示分享面板
// 创建ShareController并配置参数
let controller = new systemShare.ShareController(data);
let context = getContext(this) as common.UIAbilityContext;
// 监听分享面板关闭事件
controller.on('dismiss', () => {
console.log('分享面板已关闭');
});
// 显示分享面板
controller.show(context, {
previewMode: systemShare.SharePreviewMode.DETAIL, // 详细预览模式
selectionMode: systemShare.SelectionMode.SINGLE // 单选模式
});
1.2 关键参数说明
- UniformTypeDescriptor(UTD):定义数据类型,常见类型包括:
general.text
(文本)general.png
/general.jpeg
(图片)com.adobe.pdf
(PDF)general.mp3
(音频)
- previewMode:
BASIC
:基础模式(仅显示图标和标题)DETAIL
:详细模式(显示缩略图和内容预览)
- selectionMode:
SINGLE
:单选模式(选择一个目标设备或应用)BATCH
:批量模式(多选目标设备或应用)
二、应用间基于Share Kit分享文件
2.1 发送方代码
与设备间分享类似,只需构造SharedData
并调用show()
即可。
2.2 接收方配置
1. 实现UIAbility并处理数据
import { AbilityConstant, UIAbility, Want } from '@system.ability';
import { systemShare } from '@system.share';
import { BusinessError } from '@system.error';
export default class ReceiveAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
// 从Want中获取分享数据
systemShare.getSharedData(want)
.then((data) => {
// 遍历所有分享记录
data.getRecords().forEach(record => {
if (record.utd === utd.UniformDataType.PLAIN_TEXT) {
console.log('收到文本:', record.content);
} else if (record.utd === utd.UniformDataType.PNG) {
console.log('收到图片路径:', record.uri);
}
});
})
.catch((error: BusinessError) => {
console.error('获取分享数据失败:', error);
this.context.terminateSelf(); // 终止当前Ability
});
}
onWindowStageCreate(windowStage) {
windowStage.loadContent('pages/ReceivePage'); // 加载页面
}
}
2. 配置module.json5
在接收方应用的module.json5
中声明支持的UTD类型:
"abilities": [
{
"name": "ReceiveAbility",
"srcEntry": "./ability/receiveAbility.ets",
"exported": true,
"skills": [
{
"actions": ["ohos.want.action.sendData"], // 必须声明该动作
"uris": [
{
"scheme": "file", // 支持的协议类型
"utd": "general.text", // 支持的UTD类型
"maxFileSupported": 1 // 最大支持文件数
},
{
"scheme": "file",
"utd": "general.png",
"maxFileSupported": 5
}
]
}
]
}
]
三、注意事项
- 设备间分享前置条件
- 双设备需开启华为分享功能(设置 > 用户与账户 > 华为账号 > 华为分享)。
- 确保设备处于同一Wi-Fi网络。
- 应用间分享关键点
- 接收方必须正确配置
module.json5
的actions
和uris
,否则无法出现在分享面板中。 - 使用
systemShare.getSharedData(want)
时需在onCreate
方法中处理,避免数据丢失。
- 文件路径规范
- 使用
file://
协议时,路径需为设备的绝对路径(如file:///storage/self/0/pictures/test.png
)。
四、扩展功能:社交应用联系人捐献
社交类应用可通过意图框架捐献联系人信息,让用户一步分享到指定联系人:
// 发送方代码示例
import { intent } from '@system.intent';
// 捐献联系人信息(如微信好友列表)
intent.donateContacts(contactsList, (err) => {
if (err) {
console.error('联系人捐献失败:', err);
} else {
console.log('联系人已捐献,用户可直接选择分享目标');
}
});
五、总结
HarmonyOS的Share Kit通过统一的接口和标准化的数据类型,极大简化了跨设备、跨应用的分享流程。开发者只需关注业务逻辑,无需处理底层传输细节。无论是实现设备间的快速分享,还是构建支持接收数据的“目标应用”,均可通过本文提供的代码模板快速落地。
参考资料:
- HarmonyOS官方文档 - Share Kit
- UniformTypeDescriptor类型表
通过本文的实践,您已掌握HarmonyOS分享能力的核心实现方法。如果需要更复杂的功能(如大文件断点续传),可进一步探索HarmonyOS的分布式文件系统能力。