目录

  • 前言
  • 应用文件分享概述
  • 关于应用可分享目录
  • 文件URI规范
  • 分享文件给其他应用
  • 使用其他应用分享的文件
  • 结束语

    前言

    在移动应用开发中,文件分享功能是提升用户体验和应用互动性的关键特性之一,也是在实际开发中必用的功能,尤其是现在多端协同的时候更是需要这些功能。而HarmonyOS提供了一套完整的文件分享框架,允许应用轻松实现文件的发送和接收,开发者可以非常方便的使用这些功能,使用步骤也很简单。那么本文就来详细介绍如何在HarmonyOS应用中实现文件分享功能,包括技术选型、实现步骤和代码示例,方便查阅使用。

    应用文件分享概述

    应用文件分享是应用之间通过分享URI(Uniform Resource Identifier)或文件描述符FD(File Descriptor)的方式,进行文件共享的过程。还有就是文件分享功能允许用户将应用中的数据或文件快速分享到其他应用或设备。关于应用文件分享的方式分为以下两种:

  • 基于URI分享方式,应用可分享单个文件,通过
    ohos.app.ability.wantConstant的wantConstant.Flags接口以只读或读写权限授权给其他应用。应用可通过ohos.file.fs的fs.open打开URI,并进行读写操作。当前仅支持临时授权,分享给其他应用的文件在被分享应用退出时权限被收回。
  • 基于FD分享方式,应用可分享单个文件,通过ohos.file.fs的open接口以指定权限授权给其他应用。应用从want中解析拿到FD后可通过
    ohos.file.fs的读写接口对文件进行读写。
    需要特别说的是由于FD分享的文件关闭FD后,无法再打开分享文件,所以不推荐使用,本文主要是重点介绍基于URI分享文件给其他应用或使用其他应用分享的文件。

    关于应用可分享目录

    在HarmonyOS中,关于应用可分享目录主要有三个地方,具体如下所示:
    image.png

    文件URI规范

    在应用文件分享的时候,对于文件URL也是有一定的规范和要求的,文件URI的格式为:格式为file://<bundleName>/<path>,其中:

  • file:文件URI的标志。
  • bundleName:该文件资源的属主。
  • path:文件资源在应用沙箱中的路径。

    分享文件给其他应用

    在需要分享文件给其他应用之前,开发使用者需要先获取应用文件路径:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides...

    步骤1:获取路径

    首先,获取文件在应用沙箱中的路径,并转换为文件URI,具体操作如下所示:

import { UIAbility } from '@kit.AbilityKit';
import { fileUri } from '@kit.CoreFileKit';
import { window } from '@kit.ArkUI';

export default class EntryAbility extends UIAbility {
  onWindowStageCreate(windowStage: window.WindowStage) {
    // 获取文件的沙箱路径
    let pathInSandbox = this.context.filesDir + "/test1.txt";
    // 将沙箱路径转换为uri
    let uri = fileUri.getUriFromPath(pathInSandbox);
    // 获取的uri为"file://com.example.demo/data/storage/el2/base/files/test1.txt"
  }
}

步骤2:获取权限

然后,设置获取文件的权限以及选择要分享的应用。需要注意的是分享文件给其他应用需要使用startAbility接口,将获取到的URI填充在want的参数URI中,标注URI的文件类型,type字段可参考want属性,并通过设置want的flag来设置对应的读写权限,action字段配置为"ohos.want.action.sendData"表示进行应用文件分享,这里还需要说明一下在写权限分享时,同时授予读权限。具体操作步骤如下所示:

import { fileUri } from '@kit.CoreFileKit';
import { window } from '@kit.ArkUI';
import { wantConstant } from '@kit.AbilityKit';
import { UIAbility } from '@kit.AbilityKit';
import { Want } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';

export default class EntryAbility extends UIAbility {
  onWindowStageCreate(windowStage: window.WindowStage) {
    // 获取文件沙箱路径
    let filePath = this.context.filesDir + '/test1.txt';
    // 将沙箱路径转换为uri
    let uri = fileUri.getUriFromPath(filePath);
    let want: Want  = {
      // 配置被分享文件的读写权限,例如对被分享应用进行读写授权
      flags: wantConstant.Flags.FLAG_AUTH_WRITE_URI_PERMISSION | wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION,
      // 配置分享应用的隐式拉起规则
      action: 'ohos.want.action.sendData',
      uri: uri,
      type: 'text/plain'
    }
    this.context.startAbility(want)
      .then(() => {

      })
      .catch((err: BusinessError) => {

      });
  }
  // ...
}

使用其他应用分享的文件

然后再来分享一下使用其他应用分享的文件的操作,首先被分享应用需要在module.json5配置文件的actions标签的值配置为"ohos.want.action.sendData",表示接收应用分享文件,配置uris字段,表示接收URI的类型,即只接收其他应用分享该类型的URI,如下表示本应用只接收scheme为file,类型为txt的文件,具体操作步骤如下所示:

{
  "module": {
    ...
    "abilities": [
      {
        ...
        "skills": [
          {
            ...
            "actions": [
              "ohos.want.action.sendData"
            ],
            "uris": [
              {
                "scheme": "file",
                "type": "text/plain"
              }
           ]
          }
        ]
      }
    ]
  }
}

其中,被分享方的UIAbility被启动后,可以在其onCreate()或者onNewWant回调中获取传入的want参数信息。然后通过接口want的参数获取分享文件的URI,获取文件URI后通过fs.open接口打开文件,获取对应的file对象后,可对文件进行读写操作。具体操作如下所示:

// test.ets
import { fileIo as fs } from '@kit.CoreFileKit';
import { Want } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';

function getShareFile() {
  try {
    let want: Want = {}; // 这里在实际使用时应该修改为获取到的分享方传递过来的want信息

    // 从want信息中获取uri字段
    let uri = want.uri;
    if (uri == null || uri == undefined) {
=
      return;
    }
    try {
      // 根据需要对被分享文件的URI进行相应操作,比如读写的方式打开URI获取file对象
      let file = fs.openSync(uri, fs.OpenMode.READ_WRITE);

    } catch (err) {
      let error: BusinessError = err as BusinessError;

    }
  } catch (error) {
    let err: BusinessError = error as BusinessError;

  }
}

结束语

通过本文关于应用文件分享的详细介绍,想必大家应该都了解了如何在HarmonyOS应用中实现文件分享功能,而且在后面的鸿蒙原生开发中也会更加深入的去使用对应的功能。个人觉得,文件分享是HarmonyOS开发中的一项基本功能,它为应用提供了便捷的数据共享能力,这是一个非常有效且重要的技术点。随着技术的不断发展,文件分享功能将在HarmonyOS生态中继续扮演重要角色,给用户带来更加丰富和快捷的体验。


nshen
2.2k 声望156 粉丝