鸿蒙 - 分享功能

文章目录

  • 一、背景
  • 二、app发起分享
    • [1. 通过分享面板进行分享](#1. 通过分享面板进行分享)
    • [2. 使用其他应用打开](#2. 使用其他应用打开)
  • 二、处理分享的内容
    • [1. `module.json5` 配置可接收分享](#1. module.json5 配置可接收分享)
    • [2. 解析分享的数据](#2. 解析分享的数据)

一、背景

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

二、app发起分享

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

  1. 导入相关模块。

    import { common } from '@kit.AbilityKit';
    import { systemShare } from '@kit.ShareKit';
    import { uniformTypeDescriptor as utd } from '@kit.ArkData';

  2. 获取统一数据类型
    可以自己确定分享的类型,也可以调用方法通过后缀获取分享类型
    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
    }

  3. 构造分享数据,可添加多条分享记录。

    let shareData: systemShare.SharedData = new systemShare.SharedData({
    utd: utdTypeId,
    uri: file.uri
    });

  4. 启动分享面板时,配置分享面板显示的位置信息或关联的组件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"
    ],

  2. 配置actions,添加actions

    "actions": [
    "action.system.home",
    "ohos.want.action.select",
    "ohos.want.action.sendData",
    "ohos.want.action.viewData" // 必填,声明数据处理能力
    ],

  3. 配置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)
    }

  2. 通过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') {
    }
    });
    }

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