一、Android文件系统

Android文件系统分为 内部存储(internal storage)外部存储(external storage)

1.1 用一个表格来直观对比一下两者:

1.2 应用的私有路径

应用在安装之后,系统会自动在内部存储和外部存储,分别建立应用的私有存储区域。

内部存储 : data/user/0/packageName
外部存储 : storage/emulated/0/android/data/packageName

当应用卸载或者清除数据后,该区域文件会被删除。

1.3 内外部存储图解

二、 了解分区存储

Android 10版本中,Google推出 分区存储(scoped storage)的功能。

背景

分区存储功能是针对内置的外部存储来说的,很多应用喜欢在外部存储的根目录创建自己的文件夹,比如:storage/emulated/0/***

这样做的好处:1. 当不断向该目录存储时,应用自己的容量不会变化; 2. 当应用卸载时,该目录下文件不会被删除,可用于保存一些可持久性的文件。

但是也有坏处: 1. 对用户来说,会有很多垃圾文件存在于手机中;2. 只要获取到Read 和 Write权限,就可以随意访问外部存储的任何目录,信息安全存在隐患。

分区存储

  1. 每个应用向自己的私有目录读写文件,不需要读写权限。私有文件目录具体路径: storage/emulated/0/android/data/packageName/ ,获取方法: Context#getExternalFilesDir()
  2. 应用即使获取了读写权限,也无法访问其他应用的私有目录。
  3. 当应用需要获取媒体文件时,通过 MediaStore API 向公共存储目录DCIM、Music或者Movie获取。同样写媒体文件也是如此。并且读写自己的文件时不需要申请权限。 只有读其他应用的媒体文件时才会需要申请READ_EXTERNAL_STORAGE权限。
    (更新:Android11为目标平台时,可以使用文件直接路径去访问媒体,这是在Android10上没有的,应用的性能会略有下降,还是推荐使用MediaStore )
  4. 当应用需要获取其他非媒体文件时,比如doc、pdf文件,需要使用 系统的文件选择器SAF 来进行访问。
  5. 所以WRITE_EXTERNAL_STORAGE权限,在未来的Android11版本里,会被废弃。 (写文件不需要权限,只能在私有目录和公共目录写文件)

三、分区存储适配

旧版存储位置迁移

除了应用的私有目录和公共目录,其他位置都称为 旧版存储位置,我们需要将旧版存储位置的数据迁移到能兼容分区存储的位置。

  1. 如果以Android 11为目标平台的应用,需要在manifest清单中标记preserveLegacyExternalStoragetrue,这样在Android11的机器上覆盖安装时,才能访问旧版存储位置,卸载重装会失效。
  2. 如果以Android10为目标平台,需要在manifest清单中标记requestLegacyExternalStoragetrue,这样在Android10机器上覆盖安装才能访问旧版存储位置,卸载重装会失效。在Android11的机器上两种安装方式都会失效,需要加上preserveLegacyExternalStorage = true,且覆盖安装才能访问旧版存储位置。卸载重装会失效。
  3. 如果以Android 9及以下为目标平台时,就能正常的进行文件移动。将应用在外部存储器根目录的保存的数据中,如果能接受随应用的卸载而删除的文件,迁移至**storage/emulated/0/android/data/packageName/**目录下。需要和其他应用共享的媒体文件,迁移至媒体存储位置。

正确使用读写API

  1. 只在外部存储的应用私有目录下,用直接路径读写文件
  2. 访问或者共享媒体文件,使用MediaStore在公共目录下读写文件
  3. 访问或者共享非媒体文件,使用系统的文件选择器SAF在公共目录Download下读写文件

Android 文件系统与Android11 分区存储相关推荐

  1. 结合Android去水印APP谈谈分区存储

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 前言 方便个人更新微信状态,上周花半天时间编写简单的抖音去水印AP ...

  2. 结合Android去水印程序谈谈分区存储

    前言 为了方便个人更新微信状态,上周花半天时间编写简单的抖音去水印APP.热心的小伙伴发现在Android11上无法保存视频.震惊,土豪竟然都是高端大气Android11.于是乎,分区存储的适配工作必 ...

  3. 【错误记录】Android 低版本使用分区存储错误 ( 低版本存储不得使用 MediaStore )

    文章目录 一.报错信息 二.解决方案 Android 低版本系统中不能使用分区存储方式管理文件 ; 一.报错信息 在 Android 999 版本中使用 MediaStore 进行分区存储 ; /** ...

  4. 强制开启Android 分区存储 沙盘文件系统

    为了测试Android 11下强制分区存储后的应用兼容问题,这里摸索了下目前的打开方式 1. 在AS里下载API 30的 虚拟机 2. 打开虚拟机,进入首页后,执行 adb shell sm set- ...

  5. Android存储之分区存储适配

    一.Android存储分区介绍 1.简介 Android 存储分为内部存储(Internal storage)和外部存储(External storage).有许多用户认为外部存储意味着SD存储卡或外 ...

  6. Android 存储进化:分区存储

    一 分区存储概述 Android 10之前,Android的文件存储现象就像个垃圾桶,但凡app取得了存储空间的读写权限WRITE_EXTERNAL_STORAGE,就可以肆意创建文件,难以管理.用户 ...

  7. Android 10 分区存储完全解析

    Android 10分区存储完全解析 一.Android 存储目录 1.1 内部存储 1.2 外部存储 1.2.1 外部私有存储 1.2.2 外部公共存储 1.3 使用Api 获取存储目录 二.And ...

  8. 【Android 文件管理】分区存储 ( MediaStore 文件操作 )

    文章目录 一.动态权限申请 二.MediaStore 操作文件 三.完整代码示例 1.MainActivity 核心代码 2.build.gradle 构建脚本 3.清单文件 五.相关文档资料 特别注 ...

  9. 【Android 文件管理】分区存储 ( 分区存储机制 和 文件索引数据 )

    文章目录 一.Android 10 以前的存储机制 二.Android 10 及以后的分区存储机制 三.Android 10 中的存储过渡方案 四.文件索引数据库 五.相关文档资料 一.Android ...

最新文章

  1. 交换代数笔记1|Atiyah,Chpt.1
  2. java前后端数据交互_前后端数据交互(示例代码)
  3. boost::multiprecision模块float128相关的测试程序
  4. DS汽车通过采用沉浸式虚拟现实技术实现展厅转型
  5. TCP协议下 Socket 与 ServerSocket
  6. windows和linux的内存管理
  7. 【POJ - 2226】Muddy Fields(匈牙利算法 或 网络流dinic,二分图匹配,最小点覆盖,矩阵中优秀的建图方式 )
  8. java ++i、i++、i++ + ++i、i++ + i++原理
  9. android 动态文本选取,android-用动态文本更新UI
  10. installshield 脚本 在卸载过程执行_Linux下运行Jmeter脚本
  11. docker 管理工具_详解Docker可视化管理工具shipyard--部署教程及功能展示
  12. Google Chrome 最新市场份额
  13. python爬虫下载模块_python爬虫模块之HTML下载模块
  14. esp8266 SOC方案经过半年沉淀之后再度重启二
  15. 19.软件生命周期(2)
  16. 软考中级软件设计师——数据结构与算法基础
  17. html页面旋转图标或标签
  18. matlab求两向量夹角_12分高考答题必刷题型,“空间向量分析点到线的距离问题”...
  19. hbase shell命令行下backspace键无效解决办法
  20. Markdown 插入目录索引、更改目录名称方法

热门文章

  1. draft伦理——第六章
  2. 浏览器访问127.0.0.1已拒绝连接
  3. 剑指Offe 50:数组中重复的数字
  4. 大数据学习零基础能够学会不?
  5. 区块链技术及其在信息安全领域的研究进展 简单概括
  6. 新疆维吾尔自治区坡度数据
  7. 戴尔电脑重装系统的blos设置
  8. 获取浏览器和屏幕各种高度宽度
  9. [系统] Deepin系统常见问题解决(持续更新)
  10. ssm+jsp计算机毕业设计郑财学生经验分享平台的设计与实现hsk3u(程序+lw+源码+远程部署)