0
点赞
收藏
分享

微信扫一扫

HarmonyOS开发之原生分享

HarmonyOS的Share Kit是实现跨设备、跨应用数据共享的核心能力,支持文本、图片、音频等多种格式的无缝传输。本文将通过设备间文件分享应用间文件分享两个场景,结合代码示例,详解如何快速实现HarmonyOS原生分享功能。

一、设备间基于Share Kit分享文件

1.1 实现步骤

1. 导入模块

import { systemShare } from '@system.share'; // 分享核心模块
import { uniformTypeDescriptor as utd } from '@system.data'; // 数据类型描述模块
import { common } from '@system.ability'; // 能力模块

2. 构造分享数据

// 创建ShareData对象
let data = new systemShare.SharedData({
  utd: utd.UniformDataType.PLAIN_TEXT, // 文本类型
  content: 'Hello HarmonyOS!' // 分享文本内容
});

// 添加图片记录(支持多条记录)
data.addRecord({
  utd: utd.UniformDataType.PNG, // PNG图片类型
  uri: 'file:///storage/self/0/pictures/test.png' // 文件路径
});

3. 显示分享面板

// 创建ShareController并配置参数
let controller = new systemShare.ShareController(data);
let context = getContext(this) as common.UIAbilityContext;

// 监听分享面板关闭事件
controller.on('dismiss', () => {
  console.log('分享面板已关闭');
});

// 显示分享面板
controller.show(context, {
  previewMode: systemShare.SharePreviewMode.DETAIL, // 详细预览模式
  selectionMode: systemShare.SelectionMode.SINGLE // 单选模式
});

1.2 关键参数说明

  • UniformTypeDescriptor(UTD):定义数据类型,常见类型包括:
  • general.text(文本)
  • general.png/general.jpeg(图片)
  • com.adobe.pdf(PDF)
  • general.mp3(音频)
  • previewMode
  • BASIC:基础模式(仅显示图标和标题)
  • DETAIL:详细模式(显示缩略图和内容预览)
  • selectionMode
  • SINGLE:单选模式(选择一个目标设备或应用)
  • BATCH:批量模式(多选目标设备或应用)

二、应用间基于Share Kit分享文件

2.1 发送方代码

与设备间分享类似,只需构造SharedData并调用show()即可。

2.2 接收方配置

1. 实现UIAbility并处理数据

import { AbilityConstant, UIAbility, Want } from '@system.ability';
import { systemShare } from '@system.share';
import { BusinessError } from '@system.error';

export default class ReceiveAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
    // 从Want中获取分享数据
    systemShare.getSharedData(want)
      .then((data) => {
        // 遍历所有分享记录
        data.getRecords().forEach(record => {
          if (record.utd === utd.UniformDataType.PLAIN_TEXT) {
            console.log('收到文本:', record.content);
          } else if (record.utd === utd.UniformDataType.PNG) {
            console.log('收到图片路径:', record.uri);
          }
        });
      })
      .catch((error: BusinessError) => {
        console.error('获取分享数据失败:', error);
        this.context.terminateSelf(); // 终止当前Ability
      });
  }

  onWindowStageCreate(windowStage) {
    windowStage.loadContent('pages/ReceivePage'); // 加载页面
  }
}

2. 配置module.json5

在接收方应用的module.json5中声明支持的UTD类型:

"abilities": [
  {
    "name": "ReceiveAbility",
    "srcEntry": "./ability/receiveAbility.ets",
    "exported": true,
    "skills": [
      {
        "actions": ["ohos.want.action.sendData"], // 必须声明该动作
        "uris": [
          {
            "scheme": "file", // 支持的协议类型
            "utd": "general.text", // 支持的UTD类型
            "maxFileSupported": 1 // 最大支持文件数
          },
          {
            "scheme": "file",
            "utd": "general.png",
            "maxFileSupported": 5
          }
        ]
      }
    ]
  }
]

三、注意事项

  1. 设备间分享前置条件
  • 双设备需开启华为分享功能(设置 > 用户与账户 > 华为账号 > 华为分享)。
  • 确保设备处于同一Wi-Fi网络。
  1. 应用间分享关键点
  • 接收方必须正确配置module.json5actionsuris,否则无法出现在分享面板中。
  • 使用systemShare.getSharedData(want)时需在onCreate方法中处理,避免数据丢失。
  1. 文件路径规范
  • 使用file://协议时,路径需为设备的绝对路径(如file:///storage/self/0/pictures/test.png)。

四、扩展功能:社交应用联系人捐献

社交类应用可通过意图框架捐献联系人信息,让用户一步分享到指定联系人:

// 发送方代码示例
import { intent } from '@system.intent';

// 捐献联系人信息(如微信好友列表)
intent.donateContacts(contactsList, (err) => {
  if (err) {
    console.error('联系人捐献失败:', err);
  } else {
    console.log('联系人已捐献,用户可直接选择分享目标');
  }
});

五、总结

HarmonyOS的Share Kit通过统一的接口和标准化的数据类型,极大简化了跨设备、跨应用的分享流程。开发者只需关注业务逻辑,无需处理底层传输细节。无论是实现设备间的快速分享,还是构建支持接收数据的“目标应用”,均可通过本文提供的代码模板快速落地。

参考资料

  • HarmonyOS官方文档 - Share Kit
  • UniformTypeDescriptor类型表

通过本文的实践,您已掌握HarmonyOS分享能力的核心实现方法。如果需要更复杂的功能(如大文件断点续传),可进一步探索HarmonyOS的分布式文件系统能力。

举报

相关推荐

0 条评论