上一篇
安卓开发存储路径
- 行业动态
- 2025-04-22
- 5
安卓开发存储路径详解
内部存储(Internal Storage)
- 特点:应用私有,数据默认与应用共存,卸载时自动清除。
- 路径:
/data/data/<包名>/
- 常用API:
Context.getFilesDir()
→ 应用内部文件目录(如/data/data/com.example/files/
)Context.openFileInput()
/Context.openFileOutput()
→ 读写内部文件
- 示例代码:
File internalDir = getFilesDir(); // 获取内部存储目录 File file = new File(internalDir, "test.txt");
外部存储(External Storage)
- 特点:公共目录,用户可见,需动态申请权限。
- 路径:
- 主目录:
Environment.getExternalStorageDirectory()
→/storage/emulated/0/
- 应用专属目录:
getExternalFilesDir(String type)
→/storage/emulated/0/Android/data/<包名>/
- 主目录:
- 常用API:
Context.getExternalFilesDir(String type)
→ 应用外部文件目录(如图片、视频等)MediaStore
→ 保存媒体文件到公共目录(Android Q+推荐)
- 权限:
- 安卓6.0+需动态申请
READ_EXTERNAL_STORAGE
和WRITE_EXTERNAL_STORAGE
- 安卓11+需
MANAGE_EXTERNAL_STORAGE
(仅针对外部存储全局管理)
- 安卓6.0+需动态申请
Android Q(API 29)后的存储限制
- Scoped Storage:应用默认只能访问自己的外部文件目录,公共目录需通过
MediaStore
或 SAF(Storage Access Framework)。 - 应用专属外部目录:
getExternalFilesDir(null)
→/storage/emulated/0/Android/data/<包名>/
- 无需申请存储权限,数据仍随应用卸载删除。
- 公共目录写入:
- 使用
MediaStore
保存图片/视频到 DCIM/Pictures 等目录。 - 示例代码(保存图片):
ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.DISPLAY_NAME, "test.jpg"); values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); Uri uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); OutputStream out = contentResolver.openOutputStream(uri); // 写入文件内容
- 使用
存储路径对比表
存储类型 | 路径示例 | 是否需要权限 | 卸载时是否保留 |
---|---|---|---|
内部存储 | /data/data/com.example/files/ |
无 | 否 |
外部应用目录 | /storage/emulated/0/Android/data/com.example/ |
无 | 否 |
外部公共目录 | /storage/emulated/0/Download/ |
安卓6.0+动态权限 | 是 |
MediaStore | content://media/external/images/media |
无(通过ContentResolver) | 是 |
常见问题与解决
问题1:文件写入后找不到?
- 原因:
- 未正确申请存储权限(安卓6.0+)
- 使用了错误的目录路径(如将文件写入公共目录但未声明类型)
- Android Q+未使用
MediaStore
写入公共媒体目录
- 解决方案:
- 检查
AndroidManifest.xml
中的权限声明。 - 使用
getExternalFilesDir()
或MediaStore
根据需求写入。
- 检查
- 原因:
问题2:安卓11+安装应用后无法读取外部文件?
- 原因:安卓11+对
WRITE_EXTERNAL_STORAGE
权限收紧,需声明MANAGE_EXTERNAL_STORAGE
。 - 解决方案:
- 尽量避免直接操作公共目录,改用应用专属目录或 SAF。
- 若必须访问公共目录,需引导用户手动授权管理权限。
- 原因:安卓11+对
相关问题与解答
问题1:如何判断设备是否存在外部存储?
解答:
使用 Environment.getExternalStorageState()
检查状态:
String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED)) { // 外部存储可用 } else { // 不可用(如未挂载、只读等) }
问题2:Android Q后如何保存图片到公共相册?
解答:
通过 MediaStore
插入数据到系统数据库:
ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.DISPLAY_NAME, "photo.jpg"); values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); values.put(MediaStore.Images.Media.RELATIVE_PATH, "DCIM/Camera"); // 指定相册路径 Uri uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); try (OutputStream out = contentResolver.openOutputStream(uri)) { // 将图片二进制数据写入输出流 }
注意:无需申请存储权限,但需处理 `IOException