上一篇
安卓中存储路径详解
- 行业动态
- 2025-04-24
- 2215
安卓存储路径分内部(/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卡插入