HarmonyOS鸿蒙Next碰一碰分享开发源码和流程讲解
HarmonyOS鸿蒙Next碰一碰分享开发源码和流程讲解
鸿蒙碰一碰分享开发源码和流程讲解
一、结论

鸿蒙中的碰一碰分享是系统的特色操作。很多开发者都对这个酷炫的效果非常感兴趣。不过在接入该功能之前,下意识的就会觉得很复杂。其实HarmonyOS已经对碰一碰分享的接口做了非常高的封装,开发者在调用实现该效果时,工作量很小。
并且就算没接入碰一碰分享,将两台手机顶部进行靠近,也会触发碰一碰分享功能,只不过会提示无分享内容。前提是都开启了NFC,其实底层是通过NFC进行通信。
碰一碰的接口整体就分为三个: (1)监听碰一碰harmonyShare.on(‘knockShare’, this.onKnockShare) (2)取消监听碰一碰harmonyShare.off(‘knockShare’, this.onKnockShare) (3)最后最重要的是,收到碰一碰回调后,处理要分享的信息,调用碰一碰分享发送接口。onKnockShare回调函数中的shareData分享包和调用share接口。
当监听了碰一碰分享,两个手机进行碰一碰操作时,就可以收到该操作的时机,此时在分享回调中,可以根据分享宝shareData的参数信息,进行配置,比如分享图片,还是视频,还是链接等等。shareData中的参数非常多,可以实现不同的分享效果和展示样式,具体参考文末的链接。
当不需要处理分享时,关闭监听即可。整体逻辑非常简单。
二、代码实现和详细解释
核心工具类HarmonyShareMgr,碰一碰图片分享举例:
import { harmonyShare, systemShare } from "@kit.ShareKit";
import { uniformTypeDescriptor as utd } from '@kit.ArkData';
/**
* 鸿蒙系统分享工具类
*/
export class HarmonyShareMgr{
private TAG: string = "HarmonyShareMgr";
private static mHarmonyShareMgr: HarmonyShareMgr | null = null;
public static Ins(){
if(!HarmonyShareMgr.mHarmonyShareMgr){
HarmonyShareMgr.mHarmonyShareMgr = new HarmonyShareMgr();
}
return HarmonyShareMgr.mHarmonyShareMgr;
}
// 分享图片Uri
private mImageUri: string = "";
// 分享类型
private mShareType: string = "";
/**
* 设置图片分享信息包
*/
private setImageShareData(imageUri: string){
this.mImageUri = imageUri;
this.mShareType = utd.UniformDataType.JPEG;
}
/**
* 收到碰一碰分享回调
*/
private onKnockShare = (shareTarget: harmonyShare.SharableTarget)=>{
// 打包
const shareData = new systemShare.SharedData({
utd: this.mShareType,
uri: this.mImageUri,
});
// 发送分享包
shareTarget.share(shareData);
}
public registerKnock(){
console.log(this.TAG, " registerKnock");
harmonyShare.on('knockShare', this.onKnockShare);
}
public unRegisterKnock(){
console.log(this.TAG, " unRegisterKnock");
harmonyShare.off('knockShare', this.onKnockShare);
}
}
测试页面内调用:
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { HarmonyShareMgr } from '../mgr/HarmonyShareMgr';
/**
* 鸿蒙分享测试页面
*/
@Entry
@Component
struct HarmonyShareTestPage {
private TAG: string = "AlbumSelectPage";
onPageShow(): void {
// 当前界面显示时,进行碰一碰监听
HarmonyShareMgr.Ins().registerKnock();
}
onPageHide(): void {
HarmonyShareMgr.Ins().unRegisterKnock();
}
onClickSelectPhoto = ()=>{
try {
let PhotoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
// 设置筛选过滤条件
PhotoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;
// 选择用户选择数量
PhotoSelectOptions.maxSelectNumber = 1;
// 实例化图片选择器
let photoPicker = new photoAccessHelper.PhotoViewPicker();
// 唤起安全相册组件
photoPicker.select(PhotoSelectOptions, (err: BusinessError, PhotoSelectResult: photoAccessHelper.PhotoSelectResult) => {
if (err) {
console.error(this.TAG, "onClickSelectPhoto photoPicker.select error:" + JSON.stringify(err));
return;
}
// 用户选择确认后,会回调到这里。
console.info(this.TAG, "onClickSelectPhoto photoPicker.select successfully:" + JSON.stringify(PhotoSelectResult));
// 调用碰一碰分享的图片分享赋值
HarmonyShareMgr.Ins().setImageShareData(PhotoSelectResult.photoUris[0]);
});
} catch (error) {
let err: BusinessError = error as BusinessError;
console.error(this.TAG, "onClickSelectPhoto photoPicker.select catch failed:" + JSON.stringify(err));
}
}
build() {
Row(){
Button('点击唤起相册选择')
.onClick(this.onClickSelectPhoto)
}
.justifyContent(FlexAlign.Center)
.size({
width: "100%",
height: "100%"
})
}
}
三、引用资料地址
ShareKit官方文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/share-introduction
内容分享: https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/knock-share-between-phones-content
更多关于HarmonyOS鸿蒙Next碰一碰分享开发源码和流程讲解的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
需要注意的是。不管是碰一碰分享,还是隔空传送分享。分享的接收方,图片和视频都会自动保存在接收方的媒体库中,不需要特意去写接收逻辑。文件会自动保存在文件管理中。
确实简单
鸿蒙Next碰一碰分享
鸿蒙Next碰一碰分享基于NFC技术,通过原子化服务实现。
开发流程:
- 在DevEco Studio中创建原子化服务项目,配置NFC标签的NDEF信息。
- 在
module.json5中声明NFC权限与标签过滤条件。 - 使用
tagSession相关API处理NFC标签的读取与写入。 - 实现Want启动,完成服务流转。
源码核心是定义NFC标签的发现与对应的原子化服务启动逻辑。
针对HarmonyOS Next的“碰一碰”分享功能开发,其核心是基于NFC的原子化服务流转能力。以下是关键开发流程与源码逻辑的简要说明:
一、核心机制
“碰一碰”本质是通过NFC标签触发原子化服务的跨设备拉起与数据流转。设备识别NFC标签中的服务信息后,可在本机或附近设备上直接运行对应服务(无需安装应用)。
二、开发流程
-
配置NFC标签
在AGC(AppGallery Connect)创建原子化服务项目,获取对应的服务ID与NFC配置参数。标签需写入HarmonyOS NDEF格式数据,包含服务标识。 -
声明NFC能力
在module.json5配置文件中声明ohos.permission.NFC_TAG权限与nfcTag特性:{ "module": { "abilities": [ { "name": "EntryAbility", "srcEntry": "./ets/entryability/EntryAbility.ets", "formsEnabled": true, "metadata": [ { "name": "ohos.ability.nfc_tag", "value": "your_service_id" } ] } ], "requestPermissions": [ { "name": "ohos.permission.NFC_TAG" } ] } } -
处理标签发现逻辑
在UIAbility中通过tagSession处理NFC标签扫描事件:import tag from '[@ohos](/user/ohos).nfc.tag'; // 监听NFC标签 tag.on('tagDiscover', (tagInfo) => { if (tagInfo.technology === tag.NFC_NDEF) { // 解析NDEF消息中的服务ID const ndefMessage = tagInfo.ndefMessage; const serviceId = ndefMessage.records[0].payloadToString(); // 校验并拉起对应原子化服务 this.startAbilityByServiceId(serviceId); } }); -
实现数据流转
使用continuationManager实现跨设备任务迁移:import continuationManager from '[@ohos](/user/ohos).continuation.continuationManager'; // 注册设备选择回调 continuationManager.registerContinuation((devices) => { if (devices.length > 0) { // 向目标设备迁移任务(携带当前服务上下文) continuationManager.startContinuationDevice(devices[0], { serviceId: 'your_service_id', data: { /* 需流转的数据 */ } }); } });
三、关键注意事项
- NFC标签需符合HarmonyOS NDEF协议规范,建议使用华为官方认证标签
- 原子化服务包大小需严格控制在10MB以内
- 跨设备流转要求目标设备登录相同华为账号并开启蓝牙/WLAN
四、调试方式
- 使用DevEco Studio的NFC模拟功能调试标签发现流程
- 通过分布式模拟器测试跨设备迁移场景
该能力通过系统级服务框架实现设备间无缝协作,开发者只需聚焦业务逻辑封装。具体参数配置请参考官方NFC开发指南与原子化服务开发规范。

