安卓系统采用分层存储设计,主要分为内部存储(设备内置闪存)和外部存储(可扩展存储介质),不同存储区域对应不同的用途和访问权限,具体路径根据系统版本和厂商定制可能略有差异。
路径 | 说明 | 访问权限 |
---|---|---|
/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策略允许外部存储:
MediaStore
API或请求MANAGE_EXTERNAL_STORAGE
权限READ_EXTERNAL_STORAGE
/WRITE_EXTERNAL_STORAGE
可访问全部公共路径解答:
需使用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限制导致异常。
解答:
可通过Context.getExternalFilesDir(null)
检测返回值:
null
且getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
为false
,则无可用外部存储 ACTION_POWER_CONNECTED
广播判断SD卡插入