跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
编程语言大前端

HarmonyOS 应用间图片分享功能实现

在 HarmonyOS 应用中利用 Share Kit 的 systemShare 服务实现图片分享的完整流程。核心步骤包括使用 PhotoViewPicker 选择图片,将文件拷贝至应用沙箱目录以确保权限,最后通过 ShareController 构建分享数据并调用系统分享面板完成跨应用分发。该方案充分利用了鸿蒙系统的媒体访问框架和文件系统 API。

Qiny01发布于 2026/3/25更新于 2026/7/2547 浏览
HarmonyOS 应用间图片分享功能实现

HarmonyOS 应用间图片分享功能实现

Share Kit(分享服务)介绍

Share Kit(分享服务)为应用提供文本、图片、视频等内容跨应用、跨端分享能力。

应用把需要分享的内容和预览样式配置给 Share Kit,Share Kit 将根据不同的场景进行使用:

  • 针对应用间分享的场景:根据分享的数据类型、数量等信息构建分享面板,为用户提供内容预览、推荐分享联系人、关联应用及操作界面,便于用户快速选择分享应用或操作,将内容分发到目标应用。
  • 针对跨端分享的场景:根据分享的数据类型、数量等信息构建预览界面,用于跨端分享。
应用类型相关逻辑
宿主应用宿主应用需要对可分享的内容提供分享入口,在用户点击分享时,配置分享内容到分享,拉起系统分享面板。通过分享面板发起分享碰一碰分享
目标应用需要在应用中构建具有数据处理能力组件,包括以下两种分享方式。应用内处理分享内容分享详情页处理分享内容(可选)社交类应用可遵照 意图框架 接入规范把最近分享行为联系人相关信息捐献到 意图框架,Share Kit 可从 意图框架 获取推荐信息,当用户选择推荐的联系人时,会把联系人信息随分享数据一起给到目标应用,目标应用可以根据联系人信息直接一步发送内容给指定用户。
分类

Share Kit 可以分为 systemShare 和 HarmonyShare,两者区别主要是:

  • systemShare 用于应用之间的分享
  • HarmonyShare 用于设备之间的分享

在实际开发中,两者可能配合使用:

  • 跨端分享:通过 HarmonyShare 发起碰一碰传输,接收端通过 HarmonyShare 的沙箱监听处理数据。
  • 应用内分享:通过 systemShare 构造分享内容,用户选择目标应用后跳转到对应页面。

systemShare 使用步骤

文章配图

文章配图

文章配图

1. 选择图片
  1. 配置图片选择参数
    • 创建 PhotoSelectOptions 对象,设置 MIMEType 为 IMAGE_TYPE 限制只能选择图片类型文件
    • 通过 maxSelectNumber = 5 限制最大可选择数量,符合鸿蒙系统图片选择器的多选能力
  2. 创建图片选择器实例
    • 使用 PhotoViewPicker 类(鸿蒙媒体访问框架)创建选择器实例,体现鸿蒙 API 的分层设计
  3. 调用异步选择方法
    • 通过 select() 方法触发系统图片选择界面,采用 Promise 异步处理机制:
      • 成功回调:提取返回结果中的 photoUris 数组,取首元素赋值给组件状态变量 fileUri,并打印完整 URI 列表
      • 异常处理:捕获 BusinessError 异常,输出包含错误码和消息的日志,符合 ArkTS 错误处理规范
Button("选择图片").onClick(() => {
    // 1 设置选择图片的参数
    const photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
    photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE; // 过滤选择媒体文件类型为 IMAGE
    photoSelectOptions.maxSelectNumber = 5; // 选择媒体文件的最大数目
    let uris: Array<string> = [];
    
    // 2 创建图片选择器
    const photoViewPicker = new photoAccessHelper.PhotoViewPicker();
    
    // 3 开始选择图片
    photoViewPicker.select(photoSelectOptions).then((photoSelectResult: photoAccessHelper.PhotoSelectResult) => {
        uris = photoSelectResult.photoUris;
        this.fileUri = uris[0];
        console.info('photoViewPicker.select to file succeed and uris are:' + uris);
    }).catch((err: BusinessError) => {
        console.error(`Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
    });
});
2. 拷贝到沙箱
  1. 获取沙箱路径
    • 通过 getUIContext().getHostContext() 获取 UIAbility 上下文
    • 使用 cacheDir 属性获取应用专属缓存目录(框架提供的安全存储路径)
  2. 生成唯一文件名
    • 通过 split('.').pop() 解析原始文件的扩展名(ArkTS 的字符串操作特性)
    • 使用 Date.now() 生成时间戳作为文件名前缀,确保文件名唯一性
  3. 执行文件拷贝
    • 使用 fs.openSync 以只读模式打开源文件(ArkTS 文件系统 API)
    • 调用 fs.copyFileSync 执行文件描述符到目标路径的同步拷贝操作
  4. 状态反馈
    • 成功时通过 AlertDialog 显示操作结果(ArkUI 的声明式 UI 组件)
    • 失败时捕获异常并显示错误提示(try-catch 异常处理机制)
  5. 数据绑定更新
    • 将生成的缓存路径 copyFilePath 赋值给 this.cacheUri,用于后续数据绑定或状态管理(响应式编程特性)
Button("复制到沙箱").onClick(async () => {
    try {
        const context = this.getUIContext().getHostContext() as common.UIAbilityContext;
        const cacheDir = context.cacheDir;
        const fileType = this.fileUri.split('.').pop(); // 后缀名
        
        // 生成一个新的文件名
        const fileName = Date.now() + '.' + fileType;
        // 通过缓存路径 + 文件名 拼接出完整的路径
        const copyFilePath = cacheDir + '/' + fileName;
        
        // 将文件 拷贝到 临时目录
        const file = fs.openSync(this.fileUri, fs.OpenMode.READ_ONLY);
        fs.copyFileSync(file.fd, copyFilePath);
        
        AlertDialog.show({ message: JSON.stringify('写入到沙箱', null, 2) });
        this.cacheUri = copyFilePath;
    } catch (e) {
        AlertDialog.show({ message: JSON.stringify('写入失败', null, 2) });
    }
});
3. 分享
  1. 获取 UI 上下文
    • 通过 this.getUIContext() 获取当前 UI 组件的上下文对象
    • 使用 getHostContext() 获取 UIAbility 上下文,用于后续调用系统分享能力
  2. 确定统一数据类型 (UTD)
    • 通过文件后缀名 (jpg/png/webp) 匹配对应的 UTD 类型 ID
    • 使用 utd.getUniformDataTypeByFilenameExtension API 获取标准数据类型标识
  3. 构建分享数据对象
    • 创建 systemShare.SharedData 实例,包含:
      • utd:统一数据类型标识
      • title/description:分享时显示的元数据
      • uri:通过 fileUri.getUriFromPath 转换沙箱路径为可访问 URI
  4. 初始化分享控制器
    • 创建 systemShare.ShareController 实例,绑定分享数据
  5. 显示系统分享界面
    • 调用 controller.show() 步方法,传入:
      • SelectionMode.SINGLE:单选模式
      • SharePreviewMode.DETAIL:详细预览模式
Button("分享").onClick(async () => {
    try {
        // 获取 UI 上下文
        const uiContext: UIContext = this.getUIContext();
        const context: common.UIAbilityContext = uiContext.getHostContext() as common.UIAbilityContext;
        
        // 根据图片格式确定 UTD 类型
        let utdTypeId: string;
        switch (this.fileUri.split('.').pop()) {
            case 'jpeg':
            case 'jpg':
                utdTypeId = utd.getUniformDataTypeByFilenameExtension('.jpg', utd.UniformDataType.IMAGE);
                break;
            case 'png':
                utdTypeId = utd.getUniformDataTypeByFilenameExtension('.png', utd.UniformDataType.IMAGE);
                break;
            case 'webp':
                utdTypeId = utd.getUniformDataTypeByFilenameExtension('.webp', utd.UniformDataType.IMAGE);
                break;
            default:
                utdTypeId = utd.getUniformDataTypeByFilenameExtension('.jpg', utd.UniformDataType.IMAGE);
        }
        
        // 创建分享数据,使用沙箱中的图片 URI
        const shareData: systemShare.SharedData = new systemShare.SharedData({
            utd: utdTypeId,
            title: 'Picture Title',
            description: 'Picture Description',
            uri: fileUri.getUriFromPath(this.cacheUri),
        });
        
        // 创建分享控制器
        const controller: systemShare.ShareController = new systemShare.ShareController(shareData);
        
        // 显示分享界面
        await controller.show(context, {
            selectionMode: systemShare.SelectionMode.SINGLE,
            previewMode: systemShare.SharePreviewMode.DETAIL
        });
        console.log('图片分享成功');
    } catch (e) {
        console.log('图片分享失败');
    }
});

总结

本文介绍了在鸿蒙应用中实现图片分享功能的完整流程。通过 Share Kit 的 systemShare 服务,开发者可以轻松实现应用间的图片分享。核心实现包括三个步骤:

  1. 图片选择:使用 PhotoViewPicker 调用系统图片选择器,支持多选并限制文件类型
  2. 沙箱拷贝:将选中图片拷贝到应用缓存目录,确保分享时的文件访问权限
  3. 分享操作:通过 ShareController 构建分享数据,调用系统分享面板完成跨应用分享

整个流程充分利用了鸿蒙系统的媒体访问框架、文件系统 API 和分享服务,为用户提供了原生、流畅的图片分享体验。

目录

  1. HarmonyOS 应用间图片分享功能实现
  2. Share Kit(分享服务)介绍
  3. 分类
  4. systemShare 使用步骤
  5. 1. 选择图片
  6. 2. 拷贝到沙箱
  7. 3. 分享
  8. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Dify 接入 CosyVoice3 API 构建低代码语音生成服务
  • Timed Out 错误处理:传统方法与 AI 辅助对比
  • Seedance 2.0 视频生成提示词指南:结构、参数与实战模板
  • Java 岗位面试经验:JVM、分布式、消息队列与协议
  • OpenClaw 对接飞书实现多机器人群聊配置
  • BeyondMimic 人形机器人舞蹈训练及 rl_sar 部署实践
  • Ubuntu 22.04 部署 Kubernetes 1.28 高可用集群:多 Master+Keepalived+Nginx 负载均衡
  • AR 眼镜核心技术详解:硬件架构、算法与应用场景
  • Edict 三省六部制 OpenClaw 集成封装版使用指南
  • Python Business_rules 规则引擎使用与开发流程
  • dbswitch 异构数据库迁移与同步工具
  • 无需公网 IP 实现 PostgreSQL 远程访问
  • VR、具身智能与人形机器人:通往现实世界的智能接口
  • Diffusion Transformer(DiT):将 U-Net 换成 ViT,应用于视频生成与机器人动作预测
  • AI 绘画模型下载优化指南:10 个高效解决方案
  • Python 启动器 py.exe 功能与使用指南
  • 大规模无人机检测数据集:11998 张图像支持 YOLOv8 等多格式训练
  • 用 PyMobileDevice3 管理 iOS 设备
  • OpenClaw 从 0 到 1 安装与运维指南:配置、QQ 机器人接入及故障排查
  • Stable Diffusion XL 1.0 免配置方案:灵感画廊 Streamlit UI 定制实战

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online