DEV Community

SameX
SameX

Posted on

HarmonyOS Next基于 File Access Framework 的用户文件访问与权限控制

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

引言
用户文件访问是移动应用开发中的一项重要功能,HarmonyOS Next 的 File Access Framework 为开发者提供了便捷、安全的方式来实现用户文件访问和管理。本文将深入探讨 File Access Framework 的架构、功能、权限控制以及使用方法,并通过示例代码展示如何实现文件选择、保存和文件管理操作。
1. File Access Framework 简介
File Access Framework 是 HarmonyOS Next 提供的一套用户文件访问和管理框架,它基于 ExtensionAbility 组件机制,为开发者提供统一的接口和方法,方便开发者访问和管理用户文件。File Access Framework 具有以下特点:

  • 安全性: 通过权限控制机制,确保应用只能访问授权的文件,保护用户数据安全。
  • 便捷性: 提供统一的接口和方法,简化用户文件访问流程,提高开发效率。
  • 跨设备: 支持跨设备访问用户文件,方便用户在不同设备间共享文件。 2. 文件选择与保存权限管理 为了保护用户数据安全,应用在访问用户文件之前,需要获得用户的授权。开发者需要在应用的配置文件 module.json5 中声明所需的文件选择和保存权限,例如:
"abilities": [
  {
    "name": "EntryAbility",
    "skills": [
      {
        "actions": [
          "ohos.arkui.intent.action.CHOOSE"
        ],
        "uris": [
          {
            "scheme": "file",
            "host": "*",
            "path": "/storage/*"
          }
        ]
      },
      {
        "actions": [
          "ohos.arkui.intent.action.SAVE"
        ],
        "uris": [
          {
            "scheme": "file",
            "host": "*",
            "path": "/storage/*"
          }
        ]
      }
    ]
  }
]
Enter fullscreen mode Exit fullscreen mode

3. 用户文件访问接口说明
File Access Framework 提供了以下接口供开发者使用:

  • FileAccessHelper: 提供文件访问和管理的 API 接口,例如获取文件路径、获取文件属性、创建目录、删除文件等。
  • FileAccessExtensionAbility: 提供 File Access Framework 能力,包括 UserFileManager 和 ExternalFileManager,用于管理内卡和外置存储设备上的文件。 4. 示例代码:选择与保存文件的操作 以下示例代码展示了如何使用 File Access Framework 选择图片、保存文档以及进行文件管理操作: 选择图片
import { fileAccess } from '@ohos.fileAccess';
import { Want } from '@ohos.arkui.ability';
export default class EntryAbility extends Ability {
  onWindowStageCreate(windowStage: WindowStage) {
    const.wantAgent = wantAgent.createWantAgent();
    const chooseIntent = {
      action: 'ohos.arkui.intent.action.CHOOSE',
      entities: ['image/*'],
      type: 'image/*'
    };
    const chooseWant = wantAgent.createWant(chooseIntent);
    this.context.startAbility(chooseWant, (result) => {
      if (result) {
        const uri = chooseWant.response.result;
        // 获取图片属性
        fileAccess.getFileInfo(uri, (error, fileInfo) => {
          if (error) {
            console.error('Failed to get file info:', error);
          } else {
            console.log('File info:', fileInfo);
          }
        });
      } else {
        console.log('Failed to choose image');
      }
    });
  }
}
Enter fullscreen mode Exit fullscreen mode

保存文档

import { fileAccess } from '@ohos.fileAccess';
import { Want } from '@ohos.arkui.ability';
export default class EntryAbility extends Ability {
  onWindowStageCreate(windowStage: WindowStage) {
    const.wantAgent = wantAgent.createWantAgent();
    const saveIntent = {
      action: 'ohos.arkui.intent.action.SAVE',
      type: 'text/plain'
    };
    const saveWant = wantAgent.createWant(saveIntent);
    this.context.startAbility(saveWant, (result) => {
      if (result) {
        const uri = saveWant.response.result;
        // 保存文档内容
        fileAccess.saveFile(uri, 'Hello, World!', (error) => {
          if (error) {
            console.error('Failed to save file:', error);
          } else {
            console.log('File saved successfully');
          }
        });
      } else {
        console.log('Failed to save document');
      }
    });
  }
}
Enter fullscreen mode Exit fullscreen mode

文件管理

import { fileAccess } from '@ohos.fileAccess';
export default class EntryAbility extends Ability {
  onWindowStageCreate(windowStage: WindowStage) {
    const filesDir = this.context.filesDir;
    // 创建目录
    fileAccess.createDir(filesDir + '/newDir', (error) => {
      if (error) {
        console.error('Failed to create directory:', error);
      } else {
        console.log('Directory created successfully');
      }
    });
    // 删除文件
    fileAccess.deleteFile(filesDir + '/test.txt', (error) => {
      if (error) {
        console.error('Failed to delete file:', error);
      } else {
        console.log('File deleted successfully');
      }
    });
  }
}
Enter fullscreen mode Exit fullscreen mode

5. File Access Framework 优势
File Access Framework 的优势主要体现在以下几个方面:

  • 简化开发流程: 提供统一的接口和方法,简化用户文件访问流程,提高开发效率。
  • 提高用户体验: 通过权限控制机制,确保应用只能访问授权的文件,保护用户数据安全,提高用户体验。
  • 增强应用功能: 支持跨设备访问用户文件,方便用户在不同设备间共享文件,增强应用功能。 总结 File Access Framework 为我们开发者提供了便捷、安全的方式来实现用户文件访问和管理。开发者可以利用 File Access Framework 的优势,轻松实现文件选择、保存、管理和跨设备访问等功能,为用户提供更优质的体验。

Top comments (0)