鸿蒙 - 分享功能

发布于:2025-08-08 ⋅ 阅读:(10) ⋅ 点赞:(0)

一、背景

在App开发中,分享是常用功能,这里介绍鸿蒙开发中,其他应用分享到自己的app中,或者自己的app分享给其他app
鸿蒙系统分享地址

二、app发起分享

1. 通过分享面板进行分享

  1. 导入相关模块。
import { common } from '@kit.AbilityKit';
import { systemShare } from '@kit.ShareKit';
import { uniformTypeDescriptor as utd } from '@kit.ArkData';
  1. 获取统一数据类型
    可以自己确定分享的类型,也可以调用方法通过后缀获取分享类型
    getUniformDataTypeByFilenameExtension
let utdTypeId = ""
    if (file.extension.length == 0) {
      utdTypeId = utd.UniformDataType.FOLDER
    } else {
      utdTypeId = utd.getUniformDataTypeByFilenameExtension(file.extension, utd.UniformDataType.OBJECT);
    }
    if (utdTypeId.length == 0) {
      promptAction.showToast({message: appUtils.getResString('share_tip2')})
      return
    }
  1. 构造分享数据,可添加多条分享记录。
let shareData: systemShare.SharedData = new systemShare.SharedData({
      utd: utdTypeId,
      uri: file.uri
    });
  1. 启动分享面板时,配置分享面板显示的位置信息或关联的组件ID,面板将以Popup形式展示。
let controller: systemShare.ShareController = new systemShare.ShareController(shareData);
    // 获取UIAbility上下文对象
    let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
    // 进行分享面板显示
    controller.show(context, {
      previewMode: systemShare.SharePreviewMode.DEFAULT,
      selectionMode: systemShare.SelectionMode.SINGLE
    });

2. 使用其他应用打开

通过context调用startAbility,弹出系统弹窗,使用其他应用打开文件

// Construct request data Want, taking opening a Word file as an example
    let wantInfo: Want = {
      uri: file.uri, // Indicate the URI path of the file to be opened, usually used in conjunction with type
      type: 'application/msword', // Indicate the type of file to be opened
      flags: wantConstant.Flags.FLAG_AUTH_WRITE_URI_PERMISSION, // Authorization to perform write operations on URI
    }
    // Call the startAbility interface to open files
    let context = getContext(this) as common.UIAbilityContext;
    context.startAbility(wantInfo).then(() => {
      console.info("分享成功");
    }).catch((err: BusinessError) => {
      console.info("分享失败");
    })

二、处理分享的内容

1. module.json5 配置可接收分享

module.json5 下找到 abilities标签,找到 skills

  1. 配置entities添加 "entity.system.share"
"entities": [
              "entity.system.home",
              "entity.system.share"
            ],
  1. 配置actions,添加actions
"actions": [
              "action.system.home",
              "ohos.want.action.select",
              "ohos.want.action.sendData",
              "ohos.want.action.viewData" // 必填,声明数据处理能力
            ],
  1. 配置uris
"uris": [
              {
                "scheme": "file",// 物理存储类型的基类型
                "utd": "general.entity",
                "maxFileSupported": 1,
                "linkFeature": "FileOpen"
              },
              {
                "scheme": "file",// 逻辑内容类型的基类型
                "utd": "general.object",
                "maxFileSupported": 1,
                "linkFeature": "FileOpen"
              }
            ]

2. 解析分享的数据

  1. 在其onCreate或onNewWant回调中获取传入的want参数
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET);
    // 注入Ability上下文到AppUtils
    AppUtils.getInstance().context = this.context;
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onCreate');
    ShareManager.getInstance().handelShareData(want);
  }
onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    ShareManager.getInstance().handelShareData(want)
  }
  1. 通过getSharedData 解析分享数据
/** 处理分享过来的文件 */
  public handelShareData(want: Want) {
    systemShare.getSharedData(want)
      .then((data: systemShare.SharedData) => {
        data.getRecords().forEach((record: systemShare.SharedRecord) => {
          // 处理分享数据
        });
      })
      .catch((error: BusinessError) => {
        DKLogger.error(`Failed to getSharedData. Code: ${error.code}, message: ${error.message}`);
        // this.context.terminateSelf();
        if (want.action == 'ohos.want.action.sendData'
          || want.action == 'ohos.want.action.viewData') {
        }
      });
  }

处理完分享数据,即可将数据在页面显示


网站公告

今日签到

点亮在社区的每一天
去签到