本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前 API12)在开发多语言电商平台方面的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。
在当今数字化时代,文件管理器成为了人们管理本地文件和媒体文件的重要工具。今天,我们将基于鸿蒙 Next 系统,深入探讨如何开发一个功能强大的文件管理器应用,涵盖从基础架构设计到核心功能实现的全过程,让你全面掌握鸿蒙 Next 在文件管理领域的应用开发技巧。
一、应用架构设计:MVC 架构的应用
(一)MVC 架构概述
MVC(Model-View-Controller)架构是一种经典的软件设计模式,它将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。在我们的文件管理器应用中,这种架构的应用将使代码结构更加清晰,易于维护和扩展。
(二)模型(Model)层
模型层负责处理数据的存储、检索和更新。在文件管理器应用中,它主要涉及文件和目录的操作,如文件读取、写入、删除、复制、移动等。我们将使用鸿蒙 Next 的系统 API 来实现这些操作。例如,使用fileIo模块来进行文件的读写操作,directoryIo模块来处理目录相关操作。
(三)视图(View)层
视图层负责呈现用户界面,展示文件和目录列表,以及提供操作按钮等交互元素。我们将使用 ArkUI 框架来构建用户界面,通过组件化的方式,如List组件展示文件列表,Button组件实现操作按钮,确保界面简洁、美观且易于操作。
(四)控制器(Controller)层
控制器层充当模型和视图之间的桥梁,负责处理用户输入事件,并根据业务逻辑调用模型层的相应方法。例如,当用户点击文件上传按钮时,控制器将获取用户选择的文件路径,调用模型层的上传方法将文件上传到指定位置。
(五)使用系统 Picker 实现文件选择和保存
为了遵循鸿蒙 Next 的安全原则,避免直接访问用户文件系统,我们将广泛使用系统 Picker 来实现文件选择和保存功能。当用户需要打开文件时,通过文件选择器(FilePicker)让用户选择文件,应用获取用户选择的文件路径后进行后续操作。同样,在保存文件时,使用系统提供的保存路径选择器,确保文件保存到正确的位置。
二、权限申请与管理
(一)权限机制回顾
在鸿蒙 Next 系统中,权限分为 system_grant(系统授权)和 user_grant(用户授权)两种类型。系统授权权限在应用安装时自动授予,而用户授权权限则需要在应用运行时向用户请求授权。
(二)应用所需权限及申请方式
- 读取文件权限(user_grant)
应用需要读取用户本地文件时,需申请ohos.permission.READ_EXTERNAL_STORAGE权限(假设为读取外部存储文件权限,实际根据系统定义)。在应用启动时,通过requestPermissionsFromUser()接口向用户请求授权。例如:
import {
abilityAccessCtrl, common, Permissions } from '@kit.AbilityKit';
import {
BusinessError } from '@kit.BasicServicesKit';
const readPermission: Permissions = 'ohos.permission.READ_EXTERNAL_STORAGE';
async function checkReadPermissionGrant(): Promise<abilityAccessCtrl.GrantStatus> {
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
let grantStatus: abilityAccessCtrl.GrantStatus = abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;
// 获取应用程序的 accessTokenID
let tokenId: number = 0;
try {
let bundleInfo: bundleManager.BundleInfo = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;
tokenId = appInfo.accessTokenId;
} catch (error) {
const err: BusinessError = error as BusinessError;
console.error(`Failed to get bundle info for self. Code is ${
err.code}, message is ${
err.message}`);
}
// 校验应用是否被授予权限
try {
grantStatus = await atManager.checkAccessToken(tokenId, readPermission);
} catch (error) {
const err: BusinessError = error as BusinessError;

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



