HarmonyOS 的'一碰分享'用了几次之后,感觉确实比传统配对快得多。但要把这个能力接入自己的应用,光看文档可能还会漏掉一些细节——尤其是手机和 PC 协同时的角度约束、沙箱接收的用法,以及云端图片的预览兜底。下面是我从零开始接入碰一碰分享的过程记录,顺便把官方示例里容易踩坑的地方标了出来。
环境先跑通
首先,版本不满足一切都白搭。两个场景的要求不一样:
| 分享场景 | 设备系统要求 | 开发环境 |
|---|---|---|
| 手机 ↔ 手机 | 双端 HarmonyOS NEXT Release+(推荐 5.0+) | DevEco Studio NEXT Beta1+ |
| 手机 ↔ PC/2in1 | 手机同上;PC/2in1: HarmonyOS 6.0.0 Beta1+ | DevEco Studio 6.0.0 Beta1+ |
然后,在应用启动时最好用 canIUse 检查一下能力,避免在不支持的设备上把引导 UI 都画出来。代码很简单:
if (canIUse('SystemCapability.Collaboration.HarmonyShare')) {
// 注册事件
} else {
// 隐藏入口
}
整个分享的流程就四步:注册监听 → 亮屏碰一碰 → 构造并发送数据 → 离开界面时注销。手机和 PC 的差异主要在注册的事件名和配置上,但整体骨架一样。
手机之间的碰一碰
引导用户触发
用户不知道什么时候可以碰,所以需要在可分享的页面放一个官方动图和提示文字。动图资源从华为开发者网站下载(碰一碰引导资源),放到 entry/src/main/resources/rawfile 目录。我一般会在图片预览页的角落加一句'可碰一碰分享至 HarmonyOS 5 及以上手机',同时提醒对方要开启华为分享。
注册事件的核心就是在 aboutToAppear 里调 harmonyShare.on('knockShare', ...),在 aboutToDisappear 里 off 掉。代码里注意 windowId 要拿真实 UIContext 的,别随手写个 1001。
import { uniformTypeDescriptor as utd } from '@kit.ArkData';
import { systemShare, harmonyShare } from '@kit.ShareKit';
import { fileUri } from '@kit.CoreFileKit';
import { UIContext, Context } from ;
struct {
(): {
.();
}
(): {
.();
}
() {
: harmonyShare. = {
: ,
};
harmonyShare.(, capabilityRegistry, {
.(sharableTarget);
});
}
() {
: harmonyShare. = {
: ,
};
harmonyShare.(, capabilityRegistry);
}
() {
: = .();
: = uiContext.() ;
imagePath = context. + ;
thumbnailUri = fileUri.(imagePath);
: systemShare. = systemShare.({
: utd..,
: thumbnailUri,
: ,
: ,
: thumbnailUri,
});
sharableTarget.(shareData);
}
() {
}
}

