上一篇
安卓中存储路径详解
- 行业动态
- 2025-04-24
- 8
安卓存储路径分内部(/data含系统分区与应用数据)、外部(/sdcard/SD卡存媒体文件)、应用私有目录(/data/data/包名)、缓存区(/cache)及共享存储(/Pictures等),Android 10后需作用域存储权限访问
外部
安卓存储体系
安卓系统采用分层存储设计,主要分为内部存储(设备内置闪存)和外部存储(可扩展存储介质),不同存储区域对应不同的用途和访问权限,具体路径根据系统版本和厂商定制可能略有差异。
内部存储路径详解
路径 | 说明 | 访问权限 |
---|---|---|
/system |
系统核心分区,含Android操作系统核心文件、预装应用 | 仅Root权限可读写 |
/system/app |
系统应用安装目录 | 同上 |
/system/priv-app |
厂商预装特权应用目录 | 同上 |
/data |
用户数据分区,含应用安装目录和数据库 | 需签名权限或Root权限 |
/data/data/<包名> |
单个应用的私有数据目录(数据库、SharedPreferences等) | 仅限本应用访问 |
/data/app |
用户安装的应用APK存储目录(含系统更新后的应用) | 同上 |
/data/user/0 |
首个用户的数据目录(多用户场景) | 同上 |
/cache |
系统缓存目录(如Dex优化文件) | 需高级权限 |
外部存储路径详解
路径 | 说明 | |
---|---|---|
/storage/emulated/0 |
虚拟外部存储主目录(Android 4.4+) | 兼容旧版SD卡路径 |
/sdcard |
传统SD卡根目录(Android 4.4以下) | 逐渐被废弃 |
环境变量 |
EXTERNAL_STORAGE |
指向当前默认外部存储路径(可能为/storage/xxx 或/mnt/sdcard ) |
公共数据目录
子目录 | 用途 |
---|---|
DCIM |
相机拍摄图片/视频 |
Pictures |
第三方应用保存的图片 |
Movies |
第三方视频文件 |
Download |
浏览器/应用下载的文件 |
Music |
音乐文件 |
Documents |
文档类文件 |
Android/data/<包名>/ |
应用专属外部存储目录(如缓存、媒体文件) |
Android/obb/<包名>/ |
应用扩展资源包目录 |
特殊存储路径
类型 | 路径 | 特性 |
---|---|---|
应用私有目录 | context.getFilesDir() context.getCacheDir() |
仅限本应用访问,无需申请权限 |
应用外部文件 | context.getExternalFilesDir(String type) |
存储在应用专属外部目录(如/storage/emulated/0/Android/data/com.example/files ) |
系统临时目录 | /data/local/tmp |
用于存储临时文件(如ADB推送文件) |
存储权限与访问规则
内部存储:
- 应用默认可读写自身数据目录(
/data/data/包名
) - 访问其他应用数据需声明
android:sharedUserId
并获SELinux策略允许
- 应用默认可读写自身数据目录(
外部存储:
- Scoped Storage(Android 10+):
- 应用默认只能访问自己的外部存储目录
- 访问公共目录需通过
MediaStore
API或请求MANAGE_EXTERNAL_STORAGE
权限
- 传统存储模型(Android 9-):
- 申请
READ_EXTERNAL_STORAGE
/WRITE_EXTERNAL_STORAGE
可访问全部公共路径
- 申请
- Scoped Storage(Android 10+):
常见问题与解答
问题1:Android 10+如何访问公共图片目录?
解答:
需使用MediaStore
API操作媒体文件,
ContentResolver resolver = getContentResolver(); // 查询DCIM目录图片 Uri collection = MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL); Cursor cursor = resolver.query(collection, null, null, null);
直接通过文件路径访问会因Scoped Storage限制导致异常。
问题2:如何判断设备是否支持可扩展存储?
解答:
可通过Context.getExternalFilesDir(null)
检测返回值:
- 若返回
null
且getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
为false
,则无可用外部存储 - 也可监听
ACTION_POWER_CONNECTED
广播判断SD卡插入