当前位置: 首页 > news >正文

ArkTs-Android 与 ArkTS (HarmonyOS) 存储目录全面对比

核心思想概括

  • Android: 基于 Linux 文件系统Scoped Storage (分区存储) 模型。应用对大部分外部存储的访问受到严格限制,强调应用数据隔离和用户隐私保护。
  • ArkTS (HarmonyOS): 基于 HarmonyOS 应用沙箱统一的文件管理接口。它继承了类似的安全思想,但提供了更简洁、统一的 API (@ohos.file.fs 等),并且对“应用私有目录”和“公共目录”的访问有明确区分。

对比表格

特性Android (Kotlin/Java)ArkTS (HarmonyOS)核心差异与说明
API 来源Android SDK (Context, Environment, MediaStore)ArkTS UI & @ohos.file.fs, @ohos.file.fileuriHarmonyOS 使用更模块化的 JS/TS 风格 API。
沙箱/隔离模型Scoped Storage (分区存储)应用沙箱核心理念一致:应用默认只能访问自己的私有目录和授权的公共媒体文件。
1. 应用私有目录这是两者最相似的部分,都是应用卸载后数据自动清除的目录。
内部存储私有目录Context.getFilesDir()context.filesDir存储敏感数据、数据库等。无需权限
缓存目录Context.getCacheDir()context.cacheDir存储临时缓存。系统可能在存储空间不足时清理。无需权限
外部存储私有目录Context.getExternalFilesDir()context.externalFilesDir在设备外部存储上为应用创建的专属目录。无需权限
外部存储缓存目录Context.getExternalCacheDir()context.externalCacheDir在外部存储上的缓存目录。无需权限
2. 公共目录这是差异最大的部分
媒体集合 (图片、音频、视频等)MediaStore
MediaStore.Images.Media.EXTERNAL_CONTENT_URI
@ohos.file.photoAccessHelper, @ohos.file.audioAccessHelper, @ohos.file.videoAccessHelperAndroid: 通过 MediaStore ContentProvider 进行增删改查。
HarmonyOS: 通过专门的 AccessHelper 模块操作,需要申请对应的 ohos.permission.READ_XXX_STORAGE / WRITE_XXX_STORAGE 权限。
下载集合 (Downloads)MediaStore.Downloads (Android 10+)@ohos.file.fileuri
通过 fileuri.getUriFromPath 获取 Download 目录的 URI 进行操作。
Android 将其纳入 MediaStore。HarmonyOS 通过 fileuri 模块处理。
公共目录路径访问受限。Scoped Storage 下,直接通过路径(如 /sdcard/DCIM)访问已基本不可行。受限。不允许应用直接通过绝对路径访问沙箱外的公共目录。必须通过上述特定模块的 API。两者都禁止了直接路径访问,以增强安全性。
3. 权限模型
读写应用私有目录无需权限无需权限一致。
读写公共媒体文件READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE
(但从 Android 13 开始,被更细粒度的媒体权限取代)
细粒度媒体权限
- ohos.permission.READ_IMAGE_VIDEO
- ohos.permission.WRITE_IMAGE_VIDEO
- ohos.permission.READ_AUDIO
- ohos.permission.WRITE_AUDIO
趋势一致:都朝着细粒度权限发展。HarmonyOS 从一开始就采用了按媒体类型划分的权限。
4. 数据库存储
推荐位置应用内部私有目录应用内部私有目录一致。
技术Room, SQLiteOpenHelper@ohos.data.relationalStoreHarmonyOS 提供了关系型数据库的专用模块,API 设计更现代化。

代码示例对比

1. 写入应用私有文件

Android (Kotlin):

val filename = "myfile.txt"
val contents = "Hello, Android!"
context.openFileOutput(filename, Context.MODE_PRIVATE).use {it.write(contents.toByteArray())
}
// 文件路径类似:/data/data/<package_name>/files/myfile.txt

ArkTS (HarmonyOS):

import fs from '@ohos.file.fs';let context = ... // 获取UIAbility的Context
let filePath = context.filesDir + '/myfile.txt';
let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
fs.writeSync(file.fd, 'Hello, HarmonyOS!');
fs.closeSync(file);
// 文件路径类似:/data/app/el2/100/base/<package_name>/files/myfile.txt
2. 保存一张图片到公共图库

Android (Kotlin):

// 1. 使用 MediaStore 插入一条记录,获取 Uri
val values = ContentValues().apply {put(MediaStore.Images.Media.DISPLAY_NAME, "MyImage.jpg")put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES)
}
val uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)// 2. 通过 Uri 打开输出流并写入图片数据
uri?.let {contentResolver.openOutputStream(it)?.use { stream ->// bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream)}
}

ArkTS (HarmonyOS):

// 1. 导入模块
import photoAccessHelper from '@ohos.file.photoAccessHelper';
import fs from '@ohos.file.fs';// 2. 获取 PhotoAccessHelper 实例
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);// 3. 创建图片资源创建选项
let options = {title: 'MyImage.jpg'
};// 4. 创建文件并获取 Uri
phAccessHelper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'MyImage.jpg', options).then(async (uri) => {// 5. 通过 Uri 打开文件并进行写入操作let file = await fs.open(uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);// ... 将图片数据写入 file.fdfs.closeSync(file);
}).catch((err) => {console.error(`Failed to create asset. Code is ${err.code}, message is ${err.message}`);
});

总结与迁移建议

  1. 概念映射:将 Android 的 Context.getFilesDir() 等概念直接映射到 ArkTS 的 context.filesDir。私有目录的操作逻辑非常相似。
  2. 公共文件访问是重点:迁移时,需要将大量使用 MediaStoreFile 路径的代码,重构为使用 HarmonyOS 对应的 AccessHelper(如 photoAccessHelper)和 fileuri 模块。
  3. 权限调整:注意将 Android 的存储权限申请逻辑,改为 HarmonyOS 的细粒度媒体权限。
  4. API 学习:HarmonyOS 的文件 API 设计更偏向于 Node.js/前端风格(如 openSync, writeSync),对于有后端或前端经验的开发者来说可能更容易上手。
http://www.dtcms.com/a/524909.html

相关文章:

  • 网站广告费一般多少钱做网站公司名字应该用图片吗
  • 解决 Word四大烦:消标记、去波浪线、关首字母大写、禁中文引号
  • 统信系统下设置RTC时间
  • 晓羽礼品兑换系统小程序+H5
  • 九一人才网赣州找工作昆明高端seo怎么做
  • KingbaseES:MongoDB 国产化平替的优选方案,从技术适配到政务落地
  • Day 22 复习日——泰坦尼克号人员生还预测
  • Linux串口应用编程
  • 微信连接微网站吗奉化网站关键词优化费用
  • 做网站要多大的画布婚庆网站建设需求分析
  • Java Record 详解
  • UVa 1635 Irrelevant Elements
  • 个人网站怎么做推广网站设计怎么收费
  • 做招聘网站需要多少钱网站建设需要工作计划
  • Java—继承
  • 开发网站需要什么硬件网站建设公司调研汇报ppt
  • SMDJ15CA双向TVS瞬态抑制二极管:15V双向电压SMC封装
  • 【基础复习2】过采样,欠采样与SMOTE:含代码示例
  • Spring/Spring Boot工程中Bean间歇性存在的问题
  • FactionTemplate.db2
  • AI 工具网站如何快速起量?一篇讲清新词、外链与选品逻辑
  • 坪洲网站建设惠济区建设局网站
  • UVa 13099 Tobby and the Line Game
  • bash的“进程替换 + 重定向”和“传统管道”
  • 4-ARM-PEG-Olefin(2)/Biotin(2),四臂聚乙二醇-烯烃/生物素多功能支链分子,多功能分子构建
  • 网站的建设与维护工资网站建设的原则有哪些内容
  • 日常推荐电脑小知识——1
  • 外贸网站建设及推广网站优化员seo招聘
  • PLM实施专家宝典:离散制造企业研发数据“数字基因”构建方案
  • 攻克 PCB 高低差字符检测痛点!维视自聚焦系统解锁电子制造智能新范式