上一篇
安卓存储路径文件
- 行业动态
- 2025-04-22
- 3
安卓存储路径分类
安卓系统将存储分为多种类型,不同存储类型对应不同的路径和用途:
存储类型 | 路径示例 | 特点 |
---|---|---|
内部存储(Internal) | /data/data/包名/ | 应用私有目录,其他应用不可访问 |
外部存储(External) | /storage/emulated/0/ | 公共存储,所有应用可读写(需权限) |
SD卡(若存在) | /storage/extSdCard/ | 可移除存储,需动态申请权限 |
应用缓存目录 | /data/data/包名/cache/ | 存放临时文件,系统可自动清理 |
应用文件目录 | /data/data/包名/files/ | 应用私有文件存储空间 |
系统根目录 | 系统核心文件,普通应用无权限访问 |
常见文件路径与用途
文件类型 | 典型路径 | 说明 |
---|---|---|
应用安装文件 | /data/app/包名-1/ | 包含APK文件和dex优化后的代码 |
数据库文件 | /data/data/包名/databases/ | SQLite数据库默认存储位置 |
SharedPreferences | /data/data/包名/shared_prefs/ | XML格式配置文件存储路径 |
图片/视频 | /storage/emulated/0/DCIM/ (相机拍摄)/storage/emulated/0/Pictures/ (微信等保存) | 需READ_EXTERNAL_STORAGE 权限 |
下载文件 | /storage/emulated/0/Download/ | 浏览器、下载器默认路径 |
缓存文件 | /data/data/包名/cache/ | 小文件缓存,可被系统回收 |
权限管理与存储限制
运行时权限(Android 6.0+)
- 外部存储读写需动态申请:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- Android 10+ 对非媒体文件强制使用
MediaStore API
,直接文件路径访问受限。
- 外部存储读写需动态申请:
Scoped Storage(Android 10+)
- 应用默认只能访问自身创建的文件,需声明
requestLegacyExternalStorage
兼容旧逻辑。 - 访问公共目录(如DCIM)仍需通过
ContentResolver
或MediaStore
。
- 应用默认只能访问自身创建的文件,需声明
特殊存储场景处理
场景 | 解决方案 |
---|---|
跨应用共享文件 | 使用getExternalFilesDir() 获取应用专属外部存储目录,或通过ContentProvider 共享数据 |
大文件存储(如视频) | 建议使用外部存储(getExternalFilesDir(Environment.DIRECTORY_MOVIES) ) |
兼容Android 10+存储 | 使用MediaStore API写入媒体文件,或设置android:requestLegacyExternalStorage="true" |
相关问题与解答
问题1:Android 10以上如何正确保存图片到相册?
解答:
需通过MediaStore
插入媒体文件,并添加FILE_CREATOR
权限,示例代码:
ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.RELATIVE_PATH, "DCIM/Camera"); values.put(MediaStore.Images.Media.IS_PENDING, 1); // 防止扫描前被删除 Uri uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); // 写入文件后设置IS_PENDING为0
问题2:如何判断设备是否挂载了SD卡?
解答:
通过Context.getExternalFilesDirs()
检查返回数组长度,或使用Environment.getExternalStorageState()
:
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { // SD卡已挂载 }