【HarmonyOS NEXT】华为分享-碰一碰开发分享

关键词:鸿蒙、碰一碰、systemShare、harmonyShare、Share Kit

华为分享新推出碰一碰分享,支持用户通过手机碰一碰发起跨端分享,可实现传输图片、共享wifi等。我们只需调用系统 api 传入所需参数拉起对应分享卡片模板即可,无需对 UI 进行设计。

业务流程

预览效果

宿主设备开发

宿主设备当进入可分享页面时,使用 ​​harmonyShare.on()​​​ 方法注册碰一碰监听事件,当目标设备与宿主设备进行碰一碰操作后,宿主应用发现设备,调用碰一碰分享事件回调,在回调事件中构造分享数据并使用 ​​sharableTarget.share()​​ 发送。当宿主设备离开可分享页面(包括应用退至后台等场景)时,使用 ​​harmonyShare.off()​

导入相关模块

import { uniformTypeDescriptor as utd } from **********';
import { systemShare, harmonyShare } from **********';
import { fileUri } from **********';

定义碰一碰分享事件监听/取消监听方法

需要注意的是:收到碰一碰分享事件回调后,需尽快调用 ​​sharableTarget.share()​

utd 选项参考链接:​​@ohos.data.uniformTypeDescriptor (标准化数据定义与描述)​​。

此处 utd 我选择的是超链接,目标设备接收后可直接跳转链接,当配合 ​​AppLinking​

/**
   * 碰一碰触发回调
   * @param sharableTarget
   */
private immersiveCallback(sharableTarget: harmonyShare.SharableTarget) {
  const contextFaker: Context = getContext(this);
  let filePath = contextFaker.filesDir + '/exampleKnock1.jpg';
  let shareData: systemShare.SharedData = new systemShare.SharedData({
    utd: utd.UniformDataType.HYPERLINK,
    content: 'https://sharekitdemo.drcn.agconnect.link/ZB3p',
    // 根据title,description,thumbnailUri会生成不同的卡片模板。
    thumbnailUri: fileUri.getUriFromPath(filePath),
    title: '碰一碰分享卡片标题',
    description: '碰一碰分享卡片描述'
  });
  // 发起碰一碰分享
  sharableTarget.share(shareData);
}

/**
   * 注册碰一碰分享监听事件
   */
private immersiveListening() {
  harmonyShare.on('knockShare', this.immersiveCallback);
}

/**
   * 取消碰一碰分享监听事件
   */
private immersiveDisablingListening() {
  harmonyShare.off('knockShare', this.immersiveCallback);
}

处理注册碰一碰分享监听/取消监听事件

进入可分享页面时,注册碰一碰分享监听事件;离开可分享页面(包括应用退至后台等场景)时,取消碰一碰分享监听事件,避免与其他应用产生碰一碰数据传输冲突。

/**
   * 页面隐藏时取消碰一碰分享事件注册
   */
onPageHide(): void {
  let context = getContext(this);
  context.eventHub.emit('onBackGround');
}

/**
   * 组件加载时监听后台切换,应用在后台时取消碰一碰分享事件注册
   */
aboutToAppear(): void {
  this.immersiveListening();
  let context = getContext(this);
  context.eventHub.on('onBackGround', this.onBackGround);
}

/**
   * 组件销毁时监听后台切换,应用在后台时取消碰一碰分享事件注册
   */
aboutToDisappear(): void {
  this.immersiveDisablingListening();
  let context = getContext(this);
  context.eventHub.on('onBackGround', this.onBackGround);
}

/**
   * 调用取消碰一碰分享事件注册
   */
private onBackGround() {
  this.immersiveDisablingListening();
}

配套分享卡片模板

为保证碰一碰分享用户体验,Share Kit支持三种卡片模板。

卡片模板类型 说明 效果图
纯图片布局 纯图片布局只包括预览图。当分享数据为文件、图片等无需添加标题及描述的场景,推荐使用此卡片模板。- 使用方法: 构造分享数据时,仅传递预览图(thumbnailUri)字段,即可生成此卡片模板。 布局要求 预览图:支持最小宽高比1:4,超出部分将被裁剪。
沉浸式大卡布局 沉浸式大卡布局包括预览图、标题、描述、应用图标。当分享数据为链接类型时,需要向用户传递链接的内容,推荐使用此卡片模板。
使用方法:需同时满足以下2个条件:
构造分享数据时,需同时传入标题(title)、描述(description)字段和预览图(thumbnailUri)字段。
预览图宽高比小于1:1。
布局要求
预览图:支持最小宽高比1:4,超出部分将被裁剪。
标题:最大可显示2行,当文本超过2行时,未能正常在屏幕显示的文本用省略号代替。如果标题末尾有重要信息显示,需应用自行控制字数约20个中文左右。
描述:仅可显示1行,文本超过1行时,未能正常在屏幕上显示的文本用省略号代替。
应用图标:无需配置,系统将默认获取应用图标用于显示在卡片底部。
白卡上下布局 白卡上下布局包括预览图、标题、描述、应用图标。当分享数据为链接类型时,需要向用户传递链接的内容,推荐使用此卡片模板。
使用方法:需同时满足以下2个条件:
构造分享数据时,需同时传入标题(title)、描述(description)字段和预览图(thumbnailUri)字段。
预览图宽高比大于1:1。
布局要求
预览图:仅显示在卡片上方,不会铺满整个卡片。
标题:最大可显示2行,当文本超过2行时,未能正常在屏幕显示的文本用省略号代替。如果标题末尾有重要信息显示,需应用自行控制字数约20个中文左右。
描述:仅可显示1行,文本超过1行时,未能正常在屏幕上显示的文本用省略号代替。
应用图标:无需配置,系统将默认获取应用图标用于显示在卡片底部。
全部评论

相关推荐

04-27 21:45
已编辑
门头沟学院 全栈开发
入职还没开始鄙人实在无趣突然有一想法国产MCP OS邀你共建目前2/6有想法的可以私我,讲一下自己的情况,最好有相关经验,直接上手开发希望小步快跑,然后逐步完善OmniForge 是一款基于MCP协议的大模型工具生态操作系统,致力于: 全能工具集成:为各类大模型提供标准化接口,快速接入工具链(如代码生成、法律分析、数据可视化等),实现“模型即服务”; 场景化一键部署:通过模块化封装,支持法律、医疗、编程等场景的工具组合包快速加载,降低行业落地门槛; 开发者共创平台:构建开放社区,让工具开发者、模型训练者、场景应用方无缝协作,形成“工具开发-协议适配-场景分发”的闭环生态。 协议中枢:内置MCP协议解析引擎,支持动态上下文管理、工具调用编排与资源调度; 低代码扩展:提供可视化工具注册界面与SDK,开发者仅需定义输入/输出规范即可接入新工具(参考OpenTiny低代码引擎 ); 智能路由:基于大模型意图识别,自动匹配场景化工具链(如AI Coding时联动代码检查、API生成、测试部署工具); 轻量沙箱:支持工具集的独立运行与权限隔离,保障复杂任务下的稳定性。 招募计划:寻找5位先锋开发者,组成一个六人团队,当然也希望后续会有越来越多的人加入进来  加入OmniForge的价值 技术前瞻性:深度参与协议层创新,掌握大模型工具化落地的核心方法论,我很早之前接触大模型,一直觉得让模型掌握人的工具才是消除幻觉的关键,在没有mcp这个说法之前就做过notetale项目(数学分析工具和模型的通讯协议),但是单一项目开发周期长,一个持久化的框架加生态才是保障; 生态影响力:成为项目联合发起人,未来主导子模块或垂直场景开发,现在通用工具调用模型很少,部署复杂,开源遥遥无期,国内相关产品寥寥,做开创者,不做跟风者; 行动号召 “从一行代码到一个生态”我们期待与您共同书写OmniForge的第一章:   星辰大海,始于此刻。—— OmniForge 创始团队
点赞 评论 收藏
分享
05-09 00:36
产品经理
点赞 评论 收藏
分享
前些天,我盯着手机屏幕上的基金净值图,犹豫了整整半个小时。跌了快5%,是割肉止损,还是再等等?我把过往的K线图翻了无数遍,搜了一堆“类似情况会反弹吗”的帖子,内心上演了一场左右拉扯的拉锯战。最终,我选择了卖出。结果一早醒来,基金涨了。如果从外人眼里看,也许我就是那种“没什么烦恼的人”。但只有我自己知道,每当站在人生的十字路口时,我都显得异常犹豫。我总是在做决定的时候,陷入深深的拉扯。害怕选错,害怕错过,也害怕辜负了别人的期待。最终我总是选了一条“最稳妥”的路——但走着走着,我发现它似乎不是最适合我的。不是“错”得离谱,只是……它没有达到我最初的期望。我很难受,又很难后悔。最近炒股和买基金的经历,恰好放大了我这种心理。每当基金跌到一个低点,我告诉自己机会来了,买入。心里总希望明天能大涨,最好直接反弹个3%。但现实常常是,第二天继续下跌。接连几天绿油油的走势图压得我喘不过气来,当跌幅达到5%时,我终于忍不住割肉止损。可偏偏在我刚卖出的第二天,它却开始上涨,甚至回到了我原本的买入价之上——“卖在黎明前”的挫败感让我整晚都在懊悔。反过来,当某只基金连涨几天,而我却因为仓位太轻错失收益时,我又后悔没早点加仓。可等我鼓起勇气加仓后,行情又开始转头下行,仿佛专门和我作对似的。那种反复横跳的心情真的很折磨人:害怕刚做完决定,世界就往相反的方向走,害怕“我一操作,基金立马反着来”。于是我一次次怀疑自己、质疑自己的判断力——就像在人生中一次次踌躇不前一样。于是我不断回头,想:如果我当初选了另一条路呢?现在的我,会不会活得更开心、更自由、更有冲劲?还是也会面对另一种不如意?这种反复的自我审视让我意识到一个现实:我们永远无法同时体验两种人生,也永远不能等一切都“确认安全”再去行动。那些看似“顺利”的过程,其实也藏着无数不被人知的选择与挣扎。我想慢慢接受这样的自己:不是没有方向,而是太过在意方向;不是没有能力,而是太想把一切都做到完美。未来的日子可能还会有很多选择,我仍然不确定自己是否会变得果断。人生里很多决定,在当下看不出多大区别,但回头望去,它们可能会决定你三五年的走向。不要因为犹豫而一直停留原地,也不要执着于“选对”,忘了“往前走”才是关键。你可以试错,可以调整,但不能总是回头。因此,希望自己不贪婪上涨的瞬间,不恐惧短期的下跌,做计划内的事,承受计划内的波动。事后就不纠结结果,只看执行是否正确。    
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务