IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android文件系统总结——从-Android-Q-,2021年Android技术下半场在哪 -> 正文阅读

[移动开发]Android文件系统总结——从-Android-Q-,2021年Android技术下半场在哪

  • /files?数据存储空间,contet.getFilesDir() 获取

一般的,一个应用的内部存储路径未?/data/data/{packageName}/?。但是对于特殊机型比如华为,小米可能为?/data/user/0/{packageName}/

|

1
2
3
4
5

|

/data/data/{packageName}/files/
context.getFilesDir().getAbsolutePath();

/data/data/{packageName}/cache/
context.getCacheDir().getAbsolutePath();

|

storage 分区(External Storage/Shared Storage)

External Storage/Shared Storage,不需要 root 权限就可以操作。可能包含可移除的存储介质,在使用之前需要判断是否挂载(mounted)

对于 4.4 以前的手机,设备存储很小,存在一个内置的存储空间,这部分空间就是内部存储。另外,还支持一个可以移除的存储介质,就是外部存储,比如 SD 卡。随着硬件升级,大部分大于 Android 4.4 的设备内置的存储空间可以划分为 “内部存储” 和 “外部存储”。同时,若此时还支持插入 SD 卡,则外部存储空间等于 “外部存储” 和 “SD卡存储” 之和。

查看方式

|

1
2
3

|

/storage/emulated/0
@Deprecated  Android10 版本上不再推荐使用该 Api
Environment.getExternalStorageDirectory()

|

主要目录

  • storage/emulated/0/Android/
  • media/{packageName},以包名的形式区分,app的私有多媒体空间,5.0 Api可用
  • obb/{packageName},以包名的形式区分,游戏 obb 数据文件
  • data/{packageName}?以包名的形式区分,app的私有存储空间
  • /cache?缓存空间,可通过?context.getExternalCacheDir()?获取
  • /files?数据存储空间,可通过?context.getExternalFilesDir()?获取, Android 10 通过以下方法进一步操作
  • /Music, 通过?context.getExternalFilesDirs(Environment.DIRECTORY_MUSIC)?获取
  • /Podcasts, 通过?context.getExternalFilesDirs(Environment.DIRECTORY_PODCASTS)?获取
  • /Ringtones, 通过?context.getExternalFilesDirs(Environment.DIRECTORY_RINGTONES)?获取
  • /Alarms, 通过?context.getExternalFilesDirs(Environment.DIRECTORY_ALARMS)?获取
  • /Notifications, 通过?context.getExternalFilesDirs(Environment.DIRECTORY_NOTIFICATIONS)?获取
  • /Pictures, 通过?context.getExternalFilesDirs(Environment.DIRECTORY_PICTURES)?获取
  • /Movies, 通过?context.getExternalFilesDirs(Environment.DIRECTORY_MOVIES)?获取
  • mediaobb,data?Android10及以上 按包名为应用划分?沙盒目录,跟随 app 卸载而删除,外部无法访问
  • storage/emulated/0/Music/?Android 10及以上 无法通过路径访问,SAF,MediaStore 可行
  • storage/emulated/0/Pictures/?访问同上
  • storage/emulated/0/Ringtones/?访问同上
  • storage/emulated/0/Alarms/?访问同上
  • storage/emulated/0/Notifications/?访问同上
  • storage/emulated/0/Podcasts/?访问同上
  • storage/emulated/0/Movies/?访问同上
  • storage/emulated/0/Download/?访问同上
  • storage/emulated/0/DCIM/?访问同上
  • storage/emulated/0/Documents/?访问同上
  • storage/emulated/0/Screenshots/?访问同上
  • storage/emulated/0/Audiobooks/?访问同上

Android 逻辑角度看

  • App-specific storage

  • 存储类型:应用专用存储,私有目录

  • 使用方法:getFilesDir(),getCacheDir(),getExternalFilesDir(),getExternalCacheDir(),getExternalMediaDirs()

  • 操作权限:内部存储不需要权限,外部存储从 Android4.4 之后也不需要

  • 外部应用访问:无法访问内部存储,Android 10及以后无法外部存储

  • 卸载是否移除:移除

  • Preferences

  • 存储类型:内部私有存储,键值对存在

  • 使用方法:Jetpack Preferences library

  • 操作权限:不需要

  • 外部应用访问:不可以访问

  • 卸载是否移除:移除

  • Databases

  • 存储类型:内部私有存储,持久化结构

  • 使用方法:Room persistence library

  • 操作权限:不需要

  • 外部应用访问:不可以访问

  • 卸载是否移除:移除

  • Shared storage - Media

  • 存储类型:共享存储,比如一些图片,视音频

  • 使用方法:MediaStore API

  • 操作权限:Android9或者更低版本都需要?READ_EXTERNAL_STORAGE?和?WRITE_EXTERNAL_STORAGE。Android10或更高版本在访问外部app才需要

  • 外部应用访问:可以访问,但是需要?READ_EXTERNAL_STORAGE?权限

  • 卸载是否移除:不移除

  • Shared storage - Documents、files

  • 存储类型:共享存储,比如文档,文件

  • 使用方法:Storage Access Framework

  • 操作权限:不需要

  • 外部应用访问:可以访问,文件选择器可以扫描到

  • 卸载是否移除:不移除

一些重要的建议

  1. 存储作用域?scoped-storage
    针对 Android10 及以上设备,可通过?requestLegacyExternalStorage?来控制,默认?false?。低版本设备可以通过设置为?false?来开启这个特性。以下观点均默认 Andriod 10及以上版本默认支持该特性。
  2. 考虑到专用存储空间会随着 app 的卸载而被移除,针对那些用户希望独立于 app 而存在的文件,比如照片,多媒体等,不希望卸载 app 之后被删除则就应该使用共享存储来保留。
  3. 如果希望外部应用可以访问到内部存储的文件,应该使用?FileProvider?结合?FLAG_GRANT_READ_URI_PERMISSION?使用。
  4. getCacheDir()?可能因为设备内部存储空间不足而删除部分缓存文件,确保在读取之前检测文件是否存在
  5. 如果 app 仅在应用内部为用户提供有价值的多媒体信息,则应使用?getExternalFilesDir?来保存这些多媒体信息,例如选择?getExternalFilesDir(Environment.DIRECTORY_PICTURES)?。
  6. 使用 MediaStore 时,系统会自动扫描外部存储并针对媒体进行,目录为?/storage/emulated/0/
  • MediaStore.Images,被存储在?DCIM/?和?Picture/
  • MediaStore.Video,被存储在?DCIM/Picture/?和?Movies/
  • MediaStore.Audio,被存储在?Alarms/Audiobooks/Music/Notifications/Podcasts/Ringtones/
  • MediaStore.Downloads,被存储在?Download/, 这类型是 Android10 及以上可用
  • MediaStore.Files,只有 Andriod10及以上可用
  1. 如果尝试使用外部存储的文件原始路径去访问,即使你有?READ_EXTERNAL_STORAGE?权限,在 android 10 及以上也会收到?FileNotFoundException?。应该改成使用?MediaStore API?来访问。
  2. Android 10及以上版本的设备,每一个多媒体文件都有一个应用归属属性,非归属应用访问时需要授权?READ_EXTERNAL_STORAGE?权限。当应用卸载重装之后,访问之前保存的文件也会需要权限,原因是该保存的文件属于之前安装的应用。

Android10及以上实践建议

|

1
2
3
4
5
6
7

|


|

  • 读取非共享外部存储已经不需要?READ_EXTERNAL_STORAGE?和?WRITE_EXTERNAL_STORAGE,因为整体是一个?沙箱?涉及,减少权限请求。只有读取其他app的共享外部存储数据才需要,代码向下兼容。

  • 读取共享数据需要请求必要的权限,使用?MediaStore API?进行文件访问

  • 针对其他应用创建的共享文件

  • 访问:请求必要权限 -> ContentResoler 查找并打开文件

  • 写入:当且仅当你的应用是系统某个功能的默认应用才可以,比如照片管理应用,默认音乐应用等。被设置默认角色之后 -> ContentResoler 查找并打开文件,执行编辑、变更操作。

最后

愿你有一天,真爱自己,善待自己。

本文在开源项目:Android开发不会这些?如何面试拿高薪?中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-02-06 13:56:29  更:2022-02-06 13:58:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 14:40:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码