文章目录前言分享方式对比Share Kit 接入构造分享数据分享文本分享图片关键点讲解接收分享数据第一步UIAbility 中处理 Want第二步module.json5 声明分享面板自定义写在最后前言你有没有被分享到微信这个功能折磨过不同平台调用方式不同回调逻辑各异光是适配就能把人搞疯。HarmonyOS7 的 Share Kit 终于把这事儿整明白了——统一的分享面板、标准的数据格式、一套代码搞定所有分享场景。今天就来聊聊怎么用。说实话我之前对系统级分享这事儿没太大期待。毕竟 Android 的 Intent 分享机制用了很多年该有的坑一个没少。但 Share Kit 真的不一样它不光提供了统一的分享入口还把发送端和接收端的数据协议全给你标准化了。用 UTD统一数据类型替代了以前乱七八糟的 MIME 类型判断这事儿做得太对了。分享方式对比先看个表格搞清楚 HarmonyOS7 里几种分享方式的区别分享方式触发方式典型场景是否跨设备系统分享面板用户点击分享按钮分享文本、图片到社交App否碰一碰分享两台设备物理轻触近场名片、文件互传是隔空传送手势感应无需接触跨设备文件/链接推送是应用内跳转Want 隐式调用打开指定App的特定页面否日常开发中最常用的就是系统分享面板这也是今天的主角。Share Kit 接入接入 Share Kit 只需要两步导入模块 构造数据。代码很简单但有几个细节容易踩坑。import{systemShare}fromkit.ShareKitimport{uniformTypeDescriptorasutd}fromkit.ArkDataimport{common}fromkit.AbilityKit划重点kit.ShareKit是分享能力的主模块uniformTypeDescriptor是统一数据类型定义。这两个必须一起用UTD 是 Share Kit 的核心——它用标准类型标识替代了以前那种text/plain、image/png的字符串判断方式。构造分享数据letsharedData:systemShare.SharedDatanewsystemShare.SharedData({utd:utd.UniformDataType.PLAIN_TEXT,content:分享一段文字内容})这段代码做了两件事指定数据类型为PLAIN_TEXT——告诉系统你要分享的是纯文本设置分享的具体内容SharedData是分享数据的容器一个容器里可以放多条记录每条记录用addRecord追加。分享文本最简单的场景分享一段文字。functionshareText(text:string,context:common.UIAbilityContext){letdatanewsystemShare.SharedData({utd:utd.UniformDataType.PLAIN_TEXT,content:text})letcontrollernewsystemShare.ShareController(data)controller.on(dismiss,(){console.info(分享面板已关闭)})controller.show(context,{previewMode:systemShare.SharePreviewMode.DETAIL,selectionMode:systemShare.SelectionMode.SINGLE})}逐行解释ShareController是分享控制器传入SharedData即可创建controller.on(dismiss, ...)监听面板关闭事件——用户关闭分享面板后你可以做后续处理比如更新UI状态previewMode设为DETAIL表示展示详细预览另一个选项是DEFAULT只显示图标selectionMode设为SINGLE表示单选模式n选1BATCH则是批量模式分享图片分享图片稍微复杂一点因为要处理文件 URI。functionshareImage(imageUri:string,context:common.UIAbilityContext){letdatanewsystemShare.SharedData({utd:utd.UniformDataType.PNG,uri:imageUri})letcontrollernewsystemShare.ShareController(data)controller.show(context,{previewMode:systemShare.SharePreviewMode.DETAIL,selectionMode:systemShare.SelectionMode.SINGLE})}关键点讲解uri参数是图片文件的沙箱路径格式必须是file://...这种 URI 形式。你不能直接传Resource资源引用得先把图片保存到沙箱目录再拿 URI。如果你要同时分享文本和图片呢用addRecordletdatanewsystemShare.SharedData({utd:utd.UniformDataType.PLAIN_TEXT,content:看看这张图})data.addRecord({utd:utd.UniformDataType.PNG,uri:file://data/storage/el2/base/files/photo.png})注意addRecord是往同一个SharedData里追加记录。接收方拿到的是一组数据得遍历处理。接收分享数据你的 App 想出现在别人的分享面板里得做接收端配置。这是很多教程没讲清楚的部分。第一步UIAbility 中处理 Wantimport{AbilityConstant,UIAbility,Want}fromkit.AbilityKitimport{systemShare}fromkit.ShareKitexportdefaultclassShareReceiverAbilityextendsUIAbility{onCreate(want:Want,launchParam:AbilityConstant.LaunchParam):void{systemShare.getSharedData(want).then((data:systemShare.SharedData){letrecordsdata.getRecords()records.forEach((record:systemShare.SharedRecord){console.info(收到数据类型:${record.utd})if(record.utdutd.UniformDataType.PLAIN_TEXT){console.info(文本内容:${record.content})}elseif(record.utdutd.UniformDataType.PNG){console.info(图片URI:${record.uri})}})}).catch((){this.context.terminateSelf()})}}核心逻辑systemShare.getSharedData(want)从系统的 Want 对象中提取分享数据。want是系统传给你的包含发送方打包的所有内容。拿到SharedData后用getRecords()遍历每条记录根据 UTD 类型分别处理。第二步module.json5 声明这一步不配置就白搭你的 App 根本不会出现在分享面板里abilities:[{name:ShareReceiverAbility,exported:true,skills:[{actions:[ohos.want.action.sendData],uris:[{scheme:file,utd:general.text,maxFileSupported:1},{scheme:file,utd:general.png,maxFileSupported:1}]}]}]关键字段解释actions必须是ohos.want.action.sendData这是系统分享的固定 Actionuris里穷举你支持接收的数据类型general.text表示文本general.png表示 PNG 图片maxFileSupported限制最大文件数不填默认为 0分享面板自定义有时候你可能想调整分享面板的样式比如预览模式、选择模式。Share Kit 提供了几个配置项配置项可选值说明previewModeDETAIL/DEFAULT详细预览 or 简略预览selectionModeSINGLE/BATCH单选 or 批量选择content字符串自定义预览文本utdUTD 类型控制面板中显示的目标App一个更完整的示例controller.show(context,{previewMode:systemShare.SharePreviewMode.DETAIL,selectionMode:systemShare.SelectionMode.BATCH})批量模式适合文件管理器这种场景——用户选中多个文件一键分享。单选模式更适合社交分享选一个目标App就行。写在最后Share Kit 把分享这件事从一团乱麻变成了几行代码的事。UTD 统一数据类型、标准化的发送接收协议、配置驱动的面板注册——这套组合拳真的省心。我自己的感受是以前适配分享至少得折腾半天现在半小时搞定。尤其是接收端的配置只要module.json5写对了剩下的都是标准流程。如果你还在用隐式 Intent 做分享赶紧换 Share Kit 吧真的不一样。
HarmonyOS7 应用间分享:Share Kit 让分享变得如此丝滑
文章目录前言分享方式对比Share Kit 接入构造分享数据分享文本分享图片关键点讲解接收分享数据第一步UIAbility 中处理 Want第二步module.json5 声明分享面板自定义写在最后前言你有没有被分享到微信这个功能折磨过不同平台调用方式不同回调逻辑各异光是适配就能把人搞疯。HarmonyOS7 的 Share Kit 终于把这事儿整明白了——统一的分享面板、标准的数据格式、一套代码搞定所有分享场景。今天就来聊聊怎么用。说实话我之前对系统级分享这事儿没太大期待。毕竟 Android 的 Intent 分享机制用了很多年该有的坑一个没少。但 Share Kit 真的不一样它不光提供了统一的分享入口还把发送端和接收端的数据协议全给你标准化了。用 UTD统一数据类型替代了以前乱七八糟的 MIME 类型判断这事儿做得太对了。分享方式对比先看个表格搞清楚 HarmonyOS7 里几种分享方式的区别分享方式触发方式典型场景是否跨设备系统分享面板用户点击分享按钮分享文本、图片到社交App否碰一碰分享两台设备物理轻触近场名片、文件互传是隔空传送手势感应无需接触跨设备文件/链接推送是应用内跳转Want 隐式调用打开指定App的特定页面否日常开发中最常用的就是系统分享面板这也是今天的主角。Share Kit 接入接入 Share Kit 只需要两步导入模块 构造数据。代码很简单但有几个细节容易踩坑。import{systemShare}fromkit.ShareKitimport{uniformTypeDescriptorasutd}fromkit.ArkDataimport{common}fromkit.AbilityKit划重点kit.ShareKit是分享能力的主模块uniformTypeDescriptor是统一数据类型定义。这两个必须一起用UTD 是 Share Kit 的核心——它用标准类型标识替代了以前那种text/plain、image/png的字符串判断方式。构造分享数据letsharedData:systemShare.SharedDatanewsystemShare.SharedData({utd:utd.UniformDataType.PLAIN_TEXT,content:分享一段文字内容})这段代码做了两件事指定数据类型为PLAIN_TEXT——告诉系统你要分享的是纯文本设置分享的具体内容SharedData是分享数据的容器一个容器里可以放多条记录每条记录用addRecord追加。分享文本最简单的场景分享一段文字。functionshareText(text:string,context:common.UIAbilityContext){letdatanewsystemShare.SharedData({utd:utd.UniformDataType.PLAIN_TEXT,content:text})letcontrollernewsystemShare.ShareController(data)controller.on(dismiss,(){console.info(分享面板已关闭)})controller.show(context,{previewMode:systemShare.SharePreviewMode.DETAIL,selectionMode:systemShare.SelectionMode.SINGLE})}逐行解释ShareController是分享控制器传入SharedData即可创建controller.on(dismiss, ...)监听面板关闭事件——用户关闭分享面板后你可以做后续处理比如更新UI状态previewMode设为DETAIL表示展示详细预览另一个选项是DEFAULT只显示图标selectionMode设为SINGLE表示单选模式n选1BATCH则是批量模式分享图片分享图片稍微复杂一点因为要处理文件 URI。functionshareImage(imageUri:string,context:common.UIAbilityContext){letdatanewsystemShare.SharedData({utd:utd.UniformDataType.PNG,uri:imageUri})letcontrollernewsystemShare.ShareController(data)controller.show(context,{previewMode:systemShare.SharePreviewMode.DETAIL,selectionMode:systemShare.SelectionMode.SINGLE})}关键点讲解uri参数是图片文件的沙箱路径格式必须是file://...这种 URI 形式。你不能直接传Resource资源引用得先把图片保存到沙箱目录再拿 URI。如果你要同时分享文本和图片呢用addRecordletdatanewsystemShare.SharedData({utd:utd.UniformDataType.PLAIN_TEXT,content:看看这张图})data.addRecord({utd:utd.UniformDataType.PNG,uri:file://data/storage/el2/base/files/photo.png})注意addRecord是往同一个SharedData里追加记录。接收方拿到的是一组数据得遍历处理。接收分享数据你的 App 想出现在别人的分享面板里得做接收端配置。这是很多教程没讲清楚的部分。第一步UIAbility 中处理 Wantimport{AbilityConstant,UIAbility,Want}fromkit.AbilityKitimport{systemShare}fromkit.ShareKitexportdefaultclassShareReceiverAbilityextendsUIAbility{onCreate(want:Want,launchParam:AbilityConstant.LaunchParam):void{systemShare.getSharedData(want).then((data:systemShare.SharedData){letrecordsdata.getRecords()records.forEach((record:systemShare.SharedRecord){console.info(收到数据类型:${record.utd})if(record.utdutd.UniformDataType.PLAIN_TEXT){console.info(文本内容:${record.content})}elseif(record.utdutd.UniformDataType.PNG){console.info(图片URI:${record.uri})}})}).catch((){this.context.terminateSelf()})}}核心逻辑systemShare.getSharedData(want)从系统的 Want 对象中提取分享数据。want是系统传给你的包含发送方打包的所有内容。拿到SharedData后用getRecords()遍历每条记录根据 UTD 类型分别处理。第二步module.json5 声明这一步不配置就白搭你的 App 根本不会出现在分享面板里abilities:[{name:ShareReceiverAbility,exported:true,skills:[{actions:[ohos.want.action.sendData],uris:[{scheme:file,utd:general.text,maxFileSupported:1},{scheme:file,utd:general.png,maxFileSupported:1}]}]}]关键字段解释actions必须是ohos.want.action.sendData这是系统分享的固定 Actionuris里穷举你支持接收的数据类型general.text表示文本general.png表示 PNG 图片maxFileSupported限制最大文件数不填默认为 0分享面板自定义有时候你可能想调整分享面板的样式比如预览模式、选择模式。Share Kit 提供了几个配置项配置项可选值说明previewModeDETAIL/DEFAULT详细预览 or 简略预览selectionModeSINGLE/BATCH单选 or 批量选择content字符串自定义预览文本utdUTD 类型控制面板中显示的目标App一个更完整的示例controller.show(context,{previewMode:systemShare.SharePreviewMode.DETAIL,selectionMode:systemShare.SelectionMode.BATCH})批量模式适合文件管理器这种场景——用户选中多个文件一键分享。单选模式更适合社交分享选一个目标App就行。写在最后Share Kit 把分享这件事从一团乱麻变成了几行代码的事。UTD 统一数据类型、标准化的发送接收协议、配置驱动的面板注册——这套组合拳真的省心。我自己的感受是以前适配分享至少得折腾半天现在半小时搞定。尤其是接收端的配置只要module.json5写对了剩下的都是标准流程。如果你还在用隐式 Intent 做分享赶紧换 Share Kit 吧真的不一样。