分布式能力加持下,如何让会议记录实现"碰一碰"即时分享?
作为从业12年的研发老兵,李小雨在技术演进的关键节点深度投入鸿蒙生态,亲历了HarmonyOS系统能力持续升级的重要阶段。通过"会议随记Pro"的开发实践,重点分享如何运用HarmonyOS 6新特性重塑会议体验,并深入解析"碰一碰"文件分享的实战经验。
研发老兵与鸿蒙的“并行进化史”
李小雨将自己的技术演进历程概括为两个关键阶段。
在HarmonyOS 5阶段,他将SwiftUI、Flutter的声明式开发经验迁移到ArkTS/ArkUI,快速掌握了"一次开发、多端协同"的分布式逻辑。通过充分利用系统层的Share Kit等能力套件,将跨端分享交给操作系统处理,显著减少了重复代码。随着生态从"兼容过渡"转向"原生优先",李小雨技术策略也随之调整,开始聚焦原生能力深度整合,优先采用Live View等系统级任务通道,实践官方的碰一碰文件分享方案。
到2025年,随着开发资料的完善,他的技术分享重点也从"适配技巧"转向"原生API边界"和"系统工作流取舍",这既是工程权衡,也是面向生态成熟度的必要耐心。
“会议随记Pro”——用HarmonyOS 6 新特性重塑会议体验
在同质化竞争严重的当下,为什么李小雨要开发这样一款会议随记应用?


李小雨介绍,面对信息密集、碎片化的现代会议场景,如何聚焦于帮助用户快速捕捉关键节点并生成可即时分发的结构化内容成为一个核心的痛点。
在商业化层面的构思上,他认为产品价值应当围绕内容结构化与分发效率展开。免费层提供基础功能以建立用户体验,进阶订阅则提供多样化模板、批量导出等增强能力,团队版进一步支持多会议合并与模板库管理。核心指标关注时间点命中率、导出成功率、分发耗时等关键数据,通过低门槛订阅与阶梯定价策略,验证产品在缩短"信息捕获-结果产出"路径上的实际价值,最终实现从工具到效率平台的升级。
而会议随记 Pro 的独特之处在于其使用 HarmonyOS 6 版本特性 实现了"边录音、边标记时间点、边记录要点"的流畅体验。基于本地文件与数据库的存储方案,在不依赖云同步的前提下,应用将带时间戳的会议要点实时渲染为标准版式的长图,通过系统分享面板的"碰一碰"功能,实现跨设备的即时传递。这一设计充分考虑了实际会议场景的需求:接收方无需安装应用即可直接查看图片,若已安装则通过 App Linking 直达导入页面,完成后续编辑与整理。
基于整体设计理念,李小雨将以"碰一碰分享"功能为例,深入拆解其技术实现与避坑指南。
拆解“碰一碰分享”的实战思路与实现


碰一碰文件分享是 HarmonyOS 6 强化的跨设备分享工作流:应用只需调用系统分享面板(Share Kit),用户在面板中选择“触碰/碰一碰”即可将内容在设备间直达;若对端安装并声明了应用链接(App Linking),还能一键打开目标应用的指定页面完成后续处理。这一链路是系统级能力,开发者侧无需自建传输通道或云端服务即可实现跨设备直达。官方实践文档明确了“通过 Share Kit + App Linking”完成快速跨设备分享的原理与开发流程;同时,Share Kit 指南给出了在手机端发起系统分享面板的标准做法与不同数据类型(文本、图片、文件等)的开发参考。
智能分享与安全保障
李小雨指出,碰一碰文件分享 的“碰一碰”入口取决于设备与版本支持度。“我们将用户入口统一收敛到系统分享面板:检测到“碰一碰”则走直达链路;检测不到则自然回落为常规目标(保存相册、聊天工具等)。这种‘系统面板优先’的策略能覆盖更多设备矩阵,减少我们对跨端协议与硬件细节的耦合。”
他指出,会议笔记通常含敏感信息。方案层面采取两点:其一,默认生成“去 EXIF/去位置信息”的导出图,并在图面底部水印导出时间与来源,以便追溯;其二,尽量让跨设备传输走系统通道(Share Kit/Tap-to-Transfer),避免自建链路暴露。对端若通过 App Linking 进入应用,再在本地校验 payload,杜绝恶意注入。
/**
* 分享“会议随记 Pro”的会议产物:音频与时间线笔记
* @param target 'knockShare' 回调提供的 SharableTarget
* @param files 待分享文件的本地绝对路径数组,如 ['/data/storage/el2/base/…/audio.m4a','…/note.md']
* 也可以传入空数组(将弹 “未选择文件”)
*/
async shareMeetingFiles(target: harmonyShare.SharableTarget, files: string[]): Promise<void> {
if (!files || files.length === 0) {
console.warn('[KnockShare] no files to share')
return
}
// 组装 SharedData(UTD:依据扩展名推断)
const shareData = new systemShare.SharedData(this.buildRecord(files[0]))
for (let i = 1; i < files.length; i++) {
shareData.addRecord(this.buildRecord(files[i]))
}
// 触发跨设备分享(手机↔平板/2合1/手机)
// target.share(...) 是官方示例中用于实际发送的调用点。
try {
target.share(shareData)
} catch (e) {
const err = e as BusinessError
console.error(`[KnockShare] share failed: ${err?.code ?? ''} ${err?.message ?? e}`)
}
}
同时,在实现细节上,李小雨分享了其经验。“渲染时以设备 DPR 设定画布宽度(如 1080×DPR),正文采用系统同款字体与等宽数字时间戳;单图长度建议控制在数万像素以内,必要时分页生成多张,以兼顾清晰度与解码耗时。编码优先 JPEG 80–85% 以控体积;遇到大量细线与矢量符号时可切换 PNG 保真。华为‘长截图最佳实践’亦提醒开发者关注超长图的尺寸与内存开销,我们通过“合成长图”而非‘长截屏’规避了底层限制”
/**
* 将本地路径转 URI,并推断 UTD,生成 SharedRecord。
* - UTD 通过文件后缀映射:uniformTypeDescriptor.getUniformDataTypeByFilenameExtension
* - URI 使用 fileUri.getUriFromPath(this.ctx.filesDir/自定义路径均可)
*/
private buildRecord(absPath: string): systemShare.SharedRecord {
// 将绝对路径转成 'file://…' URI,便于跨设备传输
const uri: string = fileUri.getUriFromPath(absPath) // 官方 FileURI 工具。
const suffix = '.' + (absPath.split('.').pop() ?? '').toLowerCase()
const utd = uniformTypeDescriptor.getUniformDataTypeByFilenameExtension(suffix) // 官方推荐方式。
const fileName = absPath.split('/').pop() ?? 'meeting'
return {
utd, // 统一数据类型(如 UniformDataType.MEDIA / FILE / TEXT)
uri, // 文件 URI
title: fileName, // 分享标题(接收端可见)
description: '会议随记 Pro 导出文件' // 简要说明
// 如有缩略图可附带 thumbnailUri
}
}
典型使用场景
在分享的最后,他举例说明了几个HarmonyOS 6 碰一碰文件分享 功能的应用场景。
会中场景:参会者在手机端完成录音标记后,一键导出长图并通过"碰一碰"快速分享至会议室设备或同事手机,实现即时协同。
会后场景:主持人导出完整会议纪要,通过 Tap-to-Transfer 投送至电脑进行后续处理,或通过常规分享渠道进行分发,确保各类设备都能顺畅接收。
这种分层式的分享方案,既保留了核心功能的便捷性,又通过完善的回落机制确保了不同设备环境下的使用体验,真正实现了"随时记录、即时分享"的产品理念。
回顾从HarmonyOS 5到HarmonyOS 6的开发历程,李小雨认为,他的鸿蒙开发之旅印证了一个核心观点:拥抱系统能力,聚焦用户场景。
他表示,"会议随记Pro"的实现展示了如何将鸿蒙的分布式特性转化为具体的用户价值。碰一碰分享不是技术的炫技,而是为了在会议场景中实现真正的"信息无缝流转"。随着HarmonyOS生态的持续成熟,李小雨相信会有更多开发者找到系统能力与业务场景的创新结合点。
他总结道,作为开发者,需要保持对新技术的好奇,更需要具备将技术转化为实际价值的工程能力。这既是12年研发生涯给他的启示,也是他在鸿蒙生态中持续探索的动力。
6万+

被折叠的 条评论
为什么被折叠?



