从鸿蒙自由流转的实现看文件与数据管理

 

本文讲解在鸿蒙星河版( HarmonyOS NEXT,后续统一称 HarmonyOS )上开发者角度是怎么进行文件管理、数据管理,最后再结合 HarmonyOS 的自由流转场景,学以致用。希望能让阅读者从实践中更容易理解文件管理、数据管理的业务代码开发。

前言

本文主要讲解 HarmonyOS 上文件管理与数据管理这两个知识点,由浅入深,拓展到自由流转的场景跨设备读写文件和应用续接两个实际业务场景是如何实现的。下面开始讲解。

文件管理与跨设备管理

文件分类

我们首先看一下 HarmonyOS 定义的文件全景图

鸿蒙文件全景图

HarmonyOS 从文件所有者的角度分类有三种文件类型

  • 应用文件
  • 用户文件(开发者读写需要申请权限)
  • 系统文件(开发者无法进行操作)

如果从文件存储位置的角度分类有两种文件类型

  • 本地文件
  • 分布式文件(跨设备文件)

从开发者的角度,我们经常使用的是应用文件和用户文件,本地文件和分布式文件都会有涉猎。下面我们看看从具体场景入手,学习相关文件的读写操作。

应用文件的读写

应用文件的读写基本上都是使用文件访问框架( @ohos.file.fs ) 来操作,但我们需要一个文件路径才能进行文件读写,那么在 HarmonyOS 上如何获取应用文件的路径呢。 在开发者角度 HarmonyOS 提高了以下4种应用沙盒路径。

鸿蒙应用文件路径

我们在这里使用读写文本文件的例子做一个代码示例。先定义一个调用方法返回是否成功的数据类。

函数返回数据类代码

然后就是在 ArkUI 里面写如何读写文本文件的代码。这里使用了应用通用文件路径来保存文本文件。

读写应用文件使用示范

用户文件的读写

用户文件的读写在 HarmonyOS 上受到严格管制,需要在应用开发时候声明权限,并且在具体场景上会弹窗提示用户申请权限。当然 HarmonyOS 也提供了比较简便的方法,例如安全控件(可以不用在开发时候声明权限)。另外 HarmonyOS 还提供了一个 uri 格式的中转格式让开发者获取用户文件,也是处于安全的考虑。

在开发者的角度我们使用系统提供的选择器对以下3种用户文件类型进行操作。

用户文件选择器

上述方法都是返回 uri 格式的字符串表示用户文件。 取得后可以直接使用到 ArkUI 的控件里面,如 Image(uri) 是可以加载展用户图片文件的。 若需要进行进一步操作,需要使用 fs 库取得 uri 的文件描述符 fd.

let file = fs.openSync(uri, fs.OpenMode.READ_ONLY)

下面使用选择用户相册图片看看代码是怎么实现的。记得要先取得权限再调用该方法。

用户图片读取

再看看是如何写入图片到用户相册的。这边使用截屏页面组件然后保存举例。

写入图片到相册示例

自由流转之跨设备文件

自由流转的其中的经典场景是跨设备管理文件。这其中也区分了两个经典场景。

一个是使用服务互通 service Collaboration Kit 跨设备让平板、2in1设备访问手机相机、图库。 只能重设备调用轻设备,需登录同一个华为账号。

这个场景实际开发场景可能使用得比较少,有需要了解的朋友们可以去看官方文档,有比较详细的代码,我这边就粗略带过就好。

跨设备访问

第二个场景是使用分布式文件 distributedFilesDir 读写应用文件。只要是同一个华为账号登录的设备,同一个应用都能访问相同的分布式文件夹。如:车载系统、手机、平板之间的音乐访问播放;户外手机拍摄照片,平板直接访问。

回忆一下上面的应用文件读写的说明,我们只需要做两步,取得文件路径,使用 fs 进行操作,简单的罗列文件夹下所有文件的名字代码如下

分布式文件示例

数据管理与应用续接

上面介绍了 HarmonyOS 上的文件管理,下面介绍 HarmonyOS 上的数据是如何管理的。

数据全景与分类

鸿蒙数据架构图

上面是 HarmonyOS 的数据全景图。在开发者的角度常用到的有3种数据,

  • 用户首选项(Preferences):提供了轻量级配置数据的持久化能力,并支持订阅数据变化的通知能力。不支持分布式同步,常用于保存应用配置信息、用户偏好设置等。

  • 分布式数据对象(DataObject):独立提供对象型结构数据的分布式能力。如果应用需要重启后仍获取之前的对象数据(包含跨设备应用和本设备应用),则使用数据管理服务(DatamgrService)的对象持久化能力,做暂时保存。

  • 跨应用数据管理(DataShare):提供了数据提供者provider、数据消费者consumer以及同设备跨应用数据交互的增、删、改、查以及订阅通知等能力。DataShare不与任何数据库绑定,可以对接关系型数据库、键值型数据库。

下面结合实际例子介绍一下用户首选项和分布式数据对象的使用。

用户首选项与其使用

上面介绍了用户首选项的使用场景,这边提两个注意点

  • 用户首选项实例会将数据缓存在内存中,因此不建议保存太多数据,建议不超过一万条;
  • 单条数据的 value 值可以为空,但不能超过 8192 个字节.

下面简单演示一下如何保存应用版本号到用户首选项。

首选项代码例子

分布式数据对象与应用续接

分布式数据对象的使用场景是跨设备时候的数据保存。这里我使用官方的分布式邮件演示分布式数据对象的使用,同时官方也称之为这个应用场景为应用续接。

应用续接

具体看这个 gif 就能看到是用户正在手机上面使用着分布式邮件这个应用编辑邮件,后面平板或笔记本电脑上线(接入网络或者开机)了,就会在新上线的设备底部出现邮件的应用图标,用户点击该图标就会自动打开分布式应用,然后在平板或笔记本电脑上面继续邮件编写的动作。

这里从开发者的角度分析(应用的声明周期和事件):

  • 手机端: 触发UIAbility 的 onContinue(wantParam: Record<string, Object undefined>) 接口,需要在其中使用 wantParam 传递数据给续接的设备;
  • 平板端:会在 onCreate() 或者 onNewWant() 接口里面接收到手机端传递的 want , 然后做进一步处理恢复数据。

那么可以简单总结出以下两段代码

手机端:

手机端分布式数据

平板端:

平板端分布式数据

聪明的你估计也想到了,这是同一个应用,其实上面的两端代码在同一个页面里面。

总结与参考文档

这边文章介绍了 HarmonyOS 上关于文件和数据是如何管理和使用的,还使用了自由流转的案例从实践入手,结合实际场景讲述了文件、数据的代码读写使用。希望能对大家有所启发,感谢阅读。

下面是参考文档.

应用续接demo分布式邮件