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

2-3.Android 存储之存储空间(私有空间、公共空间)

一、内部存储与外部存储

  1. 内部存储指位于设备的内部存储空间

  2. 外部存储指位于设备的外部存储介质,例如,SD 卡

  • 简单理解,内部存储就是存储在手机自身,外部存储就是存储在手机可以外接的东西,好比电脑的硬盘和 U 盘

二、存储空间

  • Android 中存储空间分为私有空间和公共空间,这两种空间在数据存储的用途上和访问权限有所不同
1、私有空间
  1. 私有空间是专门为每个应用程序分配的存储空间

  2. 它用于存储该应用程序的私有数据,例如,数据库文件、SharedPreferences 文件、缓存文件等

  3. 私有空间通常位于设备的内部存储中

  4. 私有空间通常具体位于 /data/data/【应用包名】/

  5. 应用程序可以直接在其私有空间内读写文件,无需任何权限

  6. 私有空间会随着应用的消亡而消亡

2、公共空间
  1. 公共空间是供所有应用程序共享的存储空间

  2. 它用于存储公共数据,例如,照片、音频、视频等

  3. 公共空间分为内部存储和外部存储

  4. 公共空间通常具体位于 /storage/emulated/0/(模拟的 SD 卡路径),或位于 /storage/【external_storage】/(真实的外部存储介质路径)

  5. 访问公共空间中的数据需要相应的权限,有 READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE

  6. 公共空间不会随着应用的消亡而消亡


三、存储空间的目录

1、私有空间的目录
(1)基本介绍
  1. /data/data/【应用包名】/:应用的根目录

  2. /data/data/【应用包名】/files/:应用存储持久性文件的目录,例如,配置文件

  3. /data/data/【应用包名】/cache/:应用存储缓存文件的目录,系统可能会在设备存储空间不足时自动清除这些文件

  4. /data/data/【应用包名】/databases/:应用存储数据库文件的目录

  5. /data/data/【应用包名】/shared_prefs/:应用存储 SharedPreferences 文件的目录

(2)注意事项
  1. 我们通常只关注并直接获取 files 和 cache 目录

  2. 通常不会直接获取 databases 和 shared_prefs 目录

  3. 我们通常只关注内部存储的私有空间的目录

(3)目录获取
  1. 获取内部存储的私有空间的目录
String filesDirPath = getFilesDir().getPath();
Log.i(TAG, "------------------------------ " + filesDirPath);

String cacheDirPath = getCacheDir().getPath();
Log.i(TAG, "------------------------------ " + cacheDirPath);
  • 输出结果
I/MainActivity: ------------------------------ /data/user/0/com.my.storage/files
I/MainActivity: ------------------------------ /data/user/0/com.my.storage/cache
  1. 获取外部存储的私有空间的目录
String externalFilesDirPath = getExternalFilesDir(null).getPath();
Log.i(TAG, "------------------------------ " + externalFilesDirPath);

// 可以通过传递 type 参数来获取不同类型的子目录
String externalFilesPicturesDirPath = getExternalFilesDir(Environment.DIRECTORY_PICTURES).getPath();
Log.i(TAG, "------------------------------ " + externalFilesPicturesDirPath);

String externalCacheDirPath = getExternalCacheDir().getPath();
Log.i(TAG, "------------------------------ " + externalCacheDirPath);
  • 输出结果
I/MainActivity: ------------------------------ /storage/emulated/0/Android/data/com.my.storage/files
I/MainActivity: ------------------------------ /storage/emulated/0/Android/data/com.my.storage/files/Pictures
I/MainActivity: ------------------------------ /storage/emulated/0/Android/data/com.my.storage/cache
2、公共空间的目录
(1)基本介绍
  1. 图片:通常位于 /storage/emulated/0/Pictures/ 下,用于存储图片,例如,用户拍摄的照片、应用下载的图片

  2. 音频:通常位于 /storage/emulated/0/Music//storage/emulated/0/Audio/ 下,用于存储音频,例如,用户下载的音频、应用产生的音频

  3. 视频:通常位于 /storage/emulated/0/Movies//storage/emulated/0/Video/ 下,用于存储,例如,如用户录制的视频、应用下载的视频

  4. 下载:通常位于 /storage/emulated/0/Download/ 下,用于存储下载的文件,例如,APK 安装包、文档、压缩包

  • 注:公共空间的目录具体路径可能因设备而异
(2)目录获取
String picturesDirPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath();
Log.i(TAG, "------------------------------ " + picturesDirPath);

String musicDirPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getPath();
Log.i(TAG, "------------------------------ " + musicDirPath);

String moviesDirPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES).getPath();
Log.i(TAG, "------------------------------ " + moviesDirPath);

String downloadDirPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath();
Log.i(TAG, "------------------------------ " + downloadDirPath);
  • 输出结果
I/MainActivity: ------------------------------ /storage/emulated/0/Pictures
I/MainActivity: ------------------------------ /storage/emulated/0/Music
I/MainActivity: ------------------------------ /storage/emulated/0/Movies
I/MainActivity: ------------------------------ /storage/emulated/0/Download

四、存储空间的版本变化

  • 从 Android 10(API 级别 29)开始,Android 引入了分区存储机制,以限制应用对存储空间访问
  1. 在 Android 10 之前,应用可以直接通过文件系统来访问私有空间和公共空间,简单来说就是通过路径可以直接访问

  2. 在 Android 10 之后,应用开始只能通过文件系统来访问私有空间,想要访问公共空间,需要借助其他方式,例如,存储访问框架(SAF)、MediaStore


http://www.kler.cn/news/306311.html

相关文章:

  • 【Android】Room—数据库的基本操作
  • 第108集《大佛顶首楞严经》
  • CAD_Electrical 2022使用记录
  • [Python学习日记-23] Python v2 和 v3 中的字符编码
  • python定时任务,定时爬取水质和天气
  • Navicat On-Prem Server 2.0 | MySQL与MariaDB基础管理功能正式上云
  • Windows电脑A远程连接电脑B
  • Java面试篇基础部分-Java反射机制是什么
  • 镜舟科技与中启乘数科技达成战略合作,共筑数据服务新生态
  • Lua闭包
  • 基于yolov5的混凝土缺陷检测系统python源码+onnx模型+评估指标曲线+精美GUI界面
  • 【Linux C | 终端设备】Linux下 tty、ttyS*、ttyAMA*、console 的区别,以及系统输出重定向(附带代码)
  • NPM私库搭建-verdaccio(Linux)
  • 【Kubernetes】常见面试题汇总(十七)
  • Django+Vue基于OpenCV的人脸识别系统的设计与实现
  • CleanMyMac X 4.15.6正式版 mac直装破解版
  • 小阿轩yx-案例:Zabbix监控kubernetes云原生环境
  • ios 用JXCategoryView 库实现tab滑动切换viewController
  • 破解AI生成检测:如何用ChatGPT降低论文的AIGC率
  • Redis Universe: 探索无边界的数据处理星系
  • 网络安全 day6 --- 抓包技术HTTPS协议小程序PC应用WEB转发联动
  • Spring Boot-分布式系统问题
  • 运算符学习
  • Selenium元素定位:深入探索与实践
  • 【Java EE】线程安全问题的原因与解决方案
  • 滚雪球学SpringCloud[3.2讲]:Hystrix:熔断与降级详解
  • 基于JDK1.8和Maven的GeoTools 28.X源码自主构建实践
  • Python基础语法(3)下
  • 计算机毕业设计 网上体育商城系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
  • 实验一 番外篇 虚拟机联网与DHCP服务器