一碰即傳,重構跨設備文件分享體驗
用戶在分享圖片、文件或熱點時,需經歷復雜的操作流程(如打開應用、選擇文件、搜索設備、確認傳輸等),步驟繁瑣且耗時;或者需要用戶打斷當前操作(如暫停視頻播放、退出游戲界面),導致體驗不連貫。
HarmonyOS SDK 分享服務(Share Kit)推出了"碰一碰分享"能力,支持用戶通過碰一碰發起跨端分享,可實現傳輸圖片、共享WI-FI等。只需輕輕觸碰兩臺設備,即可完成內容的傳遞。
功能場景
-
宿主應用進入一個可以分享的界面,比如打開或者選中的一個文件、一條備忘錄、一個聯系人詳情,或個人熱點/WIFI等。
-
宿主應用可以分享多個內容,如選中的多張圖片等。
簡單觸碰:當您想要分享某些內容時,只需將兩臺設備在亮屏、解鎖的狀態下并且都已開啟華為分享服務(系統默認開啟),設備頂部輕碰即可觸發。

即時反饋:一旦設備接觸成功,"碰一碰分享"會立即給出反饋,告知用戶分享是否已經開始以及進度情況,用戶可以清楚地知道分享的狀態,避免不確定性帶來的困擾。
無縫切換:分享完成后,用戶可以直接返回到之前的活動或者選擇查看已發送/接收的內容。

除了便捷的操作流程外,"碰一碰分享"還支持多種類型的內容分享,涵蓋了日常生活中大多需要共享的信息形式,比如文本材料、圖片視頻和音頻文件等。
開發步驟
配置開發環境
支持的設備類型:當前僅支持手機碰手機。
支持的手機系統:雙端需HarmonyOS NEXT 5.0.0.102 SP6及以上版本,可使用canIUse進行判斷。
if (canIUse('SystemCapability.Collaboration.HarmonyShare')) {
// 支持一碰分享的能力.
}
集成開發環境:DevEco Studio NEXT Beta1及以上版本。
開發流程

開發示例
以分享App Linking直達應用為例,展示如何通過碰一碰分享實現直達應用,應用需接入App Linking以確保端到端完整的體驗。操作步驟請參考:使用App Linking實現應用間跳轉。
- 導入相關模塊
import { uniformTypeDescriptor as utd } from '@kit.ArkData';
import { systemShare, harmonyShare } from '@kit.ShareKit';
import { fileUri } from '@kit.CoreFileKit';
- 定義碰一碰分享事件監聽/取消監聽方法(收到碰一碰分享事件回調后,需盡快調用sharableTarget.share()方法發起分享,超過3秒可能會失敗)。
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);
}
- 進入可分享頁面時,注冊碰一碰分享監聽事件;離開可分享頁面(包括應用退至后臺等場景)時,取消碰一碰分享監聽事件。
// Entry Component 代碼片段
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();
}
完整示例代碼請參見:碰一碰分享示例代碼。
了解更多詳情>>
訪問分享服務官網
浙公網安備 33010602011771號