【HarmonyOS 5】鸿蒙碰一碰分享功能开发指南

【HarmonyOS 5】鸿蒙碰一碰分享功能开发指南

一、前言

碰一碰分享的定义

在 HarmonyOS NEXT 系统中,华为分享推出的碰一碰分享功能,为用户带来了便捷高效的跨端分享体验。开发者通过简单的代码实现,就能调用系统 API 拉起分享卡片模板,实现设备间的快速分享。

本文将结合 HarmonyOS 官网信息,详细介绍碰一碰分享功能的实现与应用。

碰一碰分享功能的应用场景​
文件快速传输:

在工作场景中,用户可通过碰一碰快速分享文档、表格等文件,无需繁琐的网络传输或蓝牙配对,提高工作效率。​
照片分享:

在聚会、旅行等场景下,用户能将拍摄的照片迅速分享给朋友,让美好瞬间及时传递。​
Wi-Fi 共享:

当处于陌生网络环境时,用户可通过碰一碰共享他人设备上的 Wi-Fi 连接信息,快速接入网络,避免手动输入密码的麻烦。​
文章分享:

在阅读资讯类应用时,用户可通过碰一碰将感兴趣的文章分享给他人,简化分享流程。

二、碰一碰分享功能概述

碰一碰分享功能支持用户通过设备轻触发起跨端分享,可实现图片传输、Wi-Fi 共享等功能。目前该功能仅支持手机与手机之间的操作,且双端设备需为 HarmonyOS NEXT 5.0.0.102 SP6 及以上版本,可使用canIUse进行判断。

手机应用发起碰一碰分享时,双端设备需处于亮屏、解锁状态,且均已开启华为分享服务(系统默认开启),设备顶部轻碰即可触发。若用户手动关闭华为分享服务开关,轻碰时会收到系统通知提示开启。

三、业务流程

注册靠近分享:

源端设备的宿主应用进入可分享界面后,需注册靠近分享功能,以便能响应碰一碰操作。

设备触碰与条件判断:

源端与目标设备碰一碰,此时系统会判断是否满足分享条件,如设备版本、分享服务是否开启等。

构造分享数据:

满足条件后,宿主应用构造分享数据,包括分享内容的类型、标题、描述、缩略图等信息。

发起华为分享:通过调用相关 API,发起华为分享,将分享数据传输至目标设备。

拉起目标应用:

目标设备接收分享数据后,拉起对应的目标应用。

解除注册:

分享完成后,源端设备的宿主应用解除注册靠近分享,避免后续冲突。

四、宿主设备开发步骤

导入相关模块:

在开发过程中,需要引入 arkdata、sharekit、corefilekit 等模块。例如:

dart 复制代码
import { uniformTypeDescriptor as utd } from '@kit.ArkData'; 
import { systemShare, harmonyShare } from '@kit.ShareKit'; 
import { fileUri } from '@kit.CoreFileKit';

定义方法

监听方法:定义碰一碰分享事件监听方法,通过harmonyShare.on()来实现,并传入回调函数处理分享事件。例如:

dart 复制代码
private immersiveCallback(sharableTarget: harmonyShare.SharableTarget) { 
    // 处理分享逻辑
} 
private immersiveListening() { 
    harmonyShare.on('knockShare', this.immersiveCallback); 
}

取消监听方法:

当宿主设备离开可分享页面(如应用退至后台等场景)时,需取消碰一碰分享监听事件,通过harmonyShare.off()实现。例如:

dart 复制代码
private immersiveDisablingListening() { 
    harmonyShare.off('knockShare', this.immersiveCallback); 
}

注意:收到回调后,需在 3 秒内调用
sharableTarget.share()方法发起分享,否则可能导致分享失败。

处理事件:

在页面的不同生命周期,处理注册和取消监听事件。例如:

dart 复制代码
onPageHide(): void { 
    // 页面隐藏时取消监听
    this.immersiveDisablingListening(); 
} 
aboutToAppear(): void { 
    // 页面即将显示时注册监听
    this.immersiveListening(); 
} 
aboutToDisappear(): void { 
    // 页面即将消失时取消监听
    this.immersiveDisablingListening(); 
} 
private onBackGround() { 
    // 应用退至后台时取消监听
    this.immersiveDisablingListening(); 
}

五、分享卡片模板

Share Kit 提供了三种分享卡片模板,开发者可根据分享数据类型和预览图宽高比进行选择。

纯图片布局:

适用于分享文件、图片等无需标题和描述的场景。构造分享数据时,仅传递预览图(thumbnailUri)字段。预览图支持最小宽高比 1:4,超出部分将被裁剪。

沉浸式大卡布局

用于分享链接且预览图宽高比小于 1:1 的情况。构造分享数据时,需同时传入标题、描述、预览图字段。预览图最小宽高比 1:4,标题最大显示 2 行,描述仅显示 1 行,系统默认获取应用图标。

白卡上下布局:

当分享链接且预览图宽高比大于 1:1 时使用。构造分享数据时,同样需传入标题、描述、预览图字段。预览图显示在卡片上方,标题最大显示 2 行,描述仅显示 1 行,系统默认获取应用图标。

六、源码示例分享

dart 复制代码
// 导入必要的模块:统一类型描述符、分享工具包和文件URI处理工具
import { uniformTypeDescriptor as utd } from '@kit.ArkData';
import { systemShare, harmonyShare } from '@kit.ShareKit';
import { fileUri } from '@kit.CoreFileKit';


/**
 * 组件即将显示时的生命周期回调
 * 页面加载完成,即将显示在屏幕上时触发
 */
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();
}

/**
 * 碰一碰触发回调函数
 * @param sharableTarget - 碰一碰分享目标对象,用于发起实际分享操作
 */
private immersiveCallback(sharableTarget: harmonyShare.SharableTarget) {
  // 获取当前上下文,用于访问文件系统
  const contextFaker: Context = getContext(this);
  
  // 构建分享文件的路径,exampleKnock1.jpg需提前准备在应用文件目录中
  let filePath = contextFaker.filesDir + '/exampleKnock1.jpg';
  
  // 创建分享数据对象,配置分享内容和展示样式
  let shareData: systemShare.SharedData = new systemShare.SharedData({
    // 设置分享内容类型为超链接
    utd: utd.UniformDataType.HYPERLINK,
    // 分享的链接地址
    content: 'https://sharekitdemo.drcn.agconnect.link/ZB3p',
    // 配置分享卡片的预览图(需确保文件存在)
    thumbnailUri: fileUri.getUriFromPath(filePath),
    // 分享卡片的标题(显示在卡片上方)
    title: '碰一碰分享卡片标题',
    // 分享卡片的描述信息(显示在标题下方)
    description: '碰一碰分享卡片描述'
  });
  
  // 调用分享目标对象的share方法发起碰一碰分享
  // 注意:必须在3秒内调用此方法,否则可能导致分享失败
  sharableTarget.share(shareData);
}

/**
 * 注册碰一碰分享监听事件
 * 当两个设备碰一碰时,系统会触发knockShare事件
 */
private immersiveListening() {
  // 注册碰一碰分享事件监听器,指定回调函数处理分享逻辑
  harmonyShare.on('knockShare', this.immersiveCallback);
}

/**
 * 取消碰一碰分享监听事件
 * 防止在不需要分享的场景下误触发
 */
private immersiveDisablingListening() {
  // 移除碰一碰分享事件监听器,停止接收碰一碰事件
  harmonyShare.off('knockShare', this.immersiveCallback);
}

/**
 * 页面隐藏时的生命周期回调
 * 当页面被其他页面覆盖时触发
 */
onPageHide(): void {
  // 获取当前上下文的事件中心
  let context = getContext(this);
  // 发送应用进入后台的事件通知
  context.eventHub.emit('onBackGround');
}
相关推荐
lqj_本人5 小时前
鸿蒙OS&UniApp 制作动态加载的瀑布流布局#三方框架 #Uniapp
uni-app·harmonyos
lqj_本人6 小时前
鸿蒙OS&UniApp制作一个小巧的图片浏览器#三方框架 #Uniapp
华为·uni-app·harmonyos
lqj_本人9 小时前
鸿蒙OS&UniApp 开发的下拉刷新与上拉加载列表#三方框架 #Uniapp
华为·uni-app·harmonyos
Lucky me.10 小时前
关于mac配置hdc(鸿蒙)
macos·华为·harmonyos
lqj_本人10 小时前
鸿蒙OS&UniApp 制作个人信息编辑界面与头像上传功能#三方框架 #Uniapp
uni-app·harmonyos
国产化创客11 小时前
OpenHarmony轻量系统--BearPi-Nano开发板网络程序测试
网络·物联网·harmonyos·国产化
xmweisi0212 小时前
【华为】现场配置OSPF
服务器·华为·华为认证·hcie·hcip·ospf·it培训
天夏已微凉17 小时前
OpenHarmony系统HDF驱动开发介绍(补充)
驱动开发·音视频·harmonyos
特立独行的猫a1 天前
HarmonyOS 【诗韵悠然】AI古诗词赏析APP开发实战从零到一系列(一、开篇,项目介绍)
人工智能·华为·harmonyos·古诗词