DEV Community

SameX
SameX

Posted on

HarmonyOS Next 应用文件分享:安全高效的数据交换

本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前API12)的文件管理技术细节,基于实际开发实践进行总结。
主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。
本文为原创内容,任何形式的转载必须注明出处及原作者。

引言
在移动应用开发中,文件分享功能可以帮助用户轻松地在不同应用间共享文件,提升应用之间的交互性和用户体验。HarmonyOS Next 提供了两种文件分享方式:基于 URI 和基于 FD,并提供了相应的安全控制机制,确保文件分享的安全性和可靠性。
1. 文件分享的基础概念
文件分享是指应用之间通过分享文件 URI 或文件描述符 (FD) 的方式,实现文件数据的交换和共享。HarmonyOS Next 支持应用间基于 URI 和 FD 的文件分享方式。
2. URI 和 FD 分享方式的特点
| 分享方式 | 优点 | 缺点 |
|---|---|---|
| 基于 URI | 使用方便,易于实现,支持临时授权,文件在被分享应用退出时权限被收回 | 只能分享单个文件,不支持目录分享 |
| 基于 FD | 可以分享单个文件,支持目录分享 | 文件关闭 FD 后,无法再打开分享文件,使用相对复杂 |
3. 分享权限控制与安全管理
为了保护用户数据安全,应用在分享文件之前,需要获得用户的授权。开发者需要在应用的配置文件 module.json5 中声明所需的文件分享权限,例如:

"abilities": [
  {
    "name": "EntryAbility",
    "skills": [
      {
        "actions": [
          "ohos.arkui.intent.action.SEND_DATA"
        ],
        "uris": [
          {
            "scheme": "file",
            "host": "*",
            "path": "/storage/*"
          }
        ]
      }
    ]
  }
]
Enter fullscreen mode Exit fullscreen mode

4. 示例代码:基于 URI 的文件分享实现
以下示例代码展示了如何使用 HarmonyOS Next 提供的 API 实现基于 URI 的文件分享:
分享文件

import { fileUri } from '@kit.CoreFileKit';
import { wantConstant } from '@kit.AbilityKit';
import { UIAbility } from '@kit.AbilityKit';
import { Want } from '@kit.AbilityKit';
export default class EntryAbility extends UIAbility {
  onWindowStageCreate(windowStage: WindowStage) {
    // 获取文件沙箱路径
    let filePath = this.context.filesDir + '/test.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.arkui.intent.action.SEND_DATA',
      uri: uri,
      type: 'text/plain'
    };
    // 启动分享
    this.context.startAbility(want)
      .then(() => {
        console.log('Share file successfully');
      })
      .catch((err) => {
        console.error('Failed to share file:', err);
      });
  }
}
Enter fullscreen mode Exit fullscreen mode

接收文件

import { fileIo as fs } from '@kit.CoreFileKit';
import { Want } from '@kit.AbilityKit';
export default class EntryAbility extends UIAbility {
  onNewWant(want: Want) {
    // 获取分享文件的 URI
    let uri = want.uri;
    // 打开文件
    let file = fs.openSync(uri, fs.OpenMode.READ_WRITE);
    // 读取文件内容
    // ...
    // 关闭文件
    fs.closeSync(file);
  }
}
Enter fullscreen mode Exit fullscreen mode

5. 文件分享的安全控制

  • 权限控制: 应用在分享文件之前,需要获得用户的授权。开发者需要在应用的配置文件中声明所需的文件分享权限。
  • 访问控制: 应用只能访问授权的文件,无法访问未授权的文件。
  • 数据加密: 对于敏感数据,可以使用数据加密技术,例如 AES、RSA 等,确保数据安全。 6. 总结 HarmonyOS Next 提供了两种文件分享方式:基于 URI 和基于 FD,并提供了相应的安全控制机制,确保文件分享的安全性和可靠性。我们可以根据应用需求选择合适的文件分享方式,并利用 HarmonyOS Next 提供的 API 实现文件分享功能,为用户提供更便捷的数据交换体验。同时,我们也需要重视文件分享的安全控制,确保用户数据安全。

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

Top comments (0)

Qodo Takeover

Introducing Qodo Gen 1.0: Transform Your Workflow with Agentic AI

Rather than just generating snippets, our agents understand your entire project context, can make decisions, use tools, and carry out tasks autonomously.

Read full post

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay