一、内部存储与外部存储
-
内部存储指位于设备的内部存储空间
-
外部存储指位于设备的外部存储介质,例如,SD 卡
- 简单理解,内部存储就是存储在手机自身,外部存储就是存储在手机可以外接的东西,好比电脑的硬盘和 U 盘
二、存储空间
- Android 中存储空间分为私有空间和公共空间,这两种空间在数据存储的用途上和访问权限有所不同
1、私有空间
-
私有空间是专门为每个应用程序分配的存储空间
-
它用于存储该应用程序的私有数据,例如,数据库文件、SharedPreferences 文件、缓存文件等
-
私有空间通常位于设备的内部存储中
-
私有空间通常具体位于
/data/data/【应用包名】/
-
应用程序可以直接在其私有空间内读写文件,无需任何权限
-
私有空间会随着应用的消亡而消亡
2、公共空间
-
公共空间是供所有应用程序共享的存储空间
-
它用于存储公共数据,例如,照片、音频、视频等
-
公共空间分为内部存储和外部存储
-
公共空间通常具体位于
/storage/emulated/0/
(模拟的 SD 卡路径),或位于/storage/【external_storage】/
(真实的外部存储介质路径) -
访问公共空间中的数据需要相应的权限,有
READ_EXTERNAL_STORAGE
和WRITE_EXTERNAL_STORAGE
-
公共空间不会随着应用的消亡而消亡
三、存储空间的目录
1、私有空间的目录
(1)基本介绍
-
/data/data/【应用包名】/
:应用的根目录 -
/data/data/【应用包名】/files/
:应用存储持久性文件的目录,例如,配置文件 -
/data/data/【应用包名】/cache/
:应用存储缓存文件的目录,系统可能会在设备存储空间不足时自动清除这些文件 -
/data/data/【应用包名】/databases/
:应用存储数据库文件的目录 -
/data/data/【应用包名】/shared_prefs/
:应用存储 SharedPreferences 文件的目录
(2)注意事项
-
我们通常只关注并直接获取 files 和 cache 目录
-
通常不会直接获取 databases 和
shared_prefs
目录 -
我们通常只关注内部存储的私有空间的目录
(3)目录获取
- 获取内部存储的私有空间的目录
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
- 获取外部存储的私有空间的目录
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)基本介绍
-
图片:通常位于
/storage/emulated/0/Pictures/
下,用于存储图片,例如,用户拍摄的照片、应用下载的图片 -
音频:通常位于
/storage/emulated/0/Music/
或/storage/emulated/0/Audio/
下,用于存储音频,例如,用户下载的音频、应用产生的音频 -
视频:通常位于
/storage/emulated/0/Movies/
或/storage/emulated/0/Video/
下,用于存储,例如,如用户录制的视频、应用下载的视频 -
下载:通常位于
/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 引入了分区存储机制,以限制应用对存储空间访问
-
在 Android 10 之前,应用可以直接通过文件系统来访问私有空间和公共空间,简单来说就是通过路径可以直接访问
-
在 Android 10 之后,应用开始只能通过文件系统来访问私有空间,想要访问公共空间,需要借助其他方式,例如,存储访问框架(SAF)、MediaStore