上一篇
安卓存储管理
- 行业动态
- 2025-04-22
- 3913
安卓存储体系结构
内部存储与外部存储
类型 | 路径示例 | 特性描述 |
---|---|---|
内部存储 | /data/data/包名 | 应用私有空间,包含数据库、SharedPreferences等,卸载自动清除 |
外部存储 | /storage/emulated/0 | 公共空间,包含音乐、下载等目录,需申请权限访问 |
SD卡存储 | /mnt/media_rw/SDCard | 可移除存储介质,Android 11后启用沙盒机制(Scoped Storage) |
特殊存储区域
- Cache目录:
getCacheDir()
获取,系统可自动清理 - Files目录:
getFilesDir()
获取,适合存放应用持久化文件 - ExternalCacheDir:
getExternalCacheDirs()
获取,存储多媒体缓存文件
存储权限管理
运行时权限体系
// Android 6.0+动态权限申请示例 if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE); }
Scoped Storage影响
Android版本 | 行为变化 |
---|---|
Android 10 | 强制作用域存储,应用只能访问自身创建的文件和媒体库 |
Android 11 | 完全禁用requestLegacyExternalStorage ,所有应用默认沙盒化 |
存储优化策略
文件访问最佳实践
// 使用MediaStore API保存图片(Android 10+) ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.RELATIVE_PATH, "AppName/Images"); Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
数据压缩方案
文件类型 | 压缩方式 | 工具库 |
---|---|---|
图片资源 | WebP格式转换 | libwebp |
视频文件 | H.265编码 | MediaCodec |
数据库文件 | ProGuard混淆+SQLCipher加密 | SQLite |
常见问题解决方案
存储空间不足处理
- 使用
StorageStatsManager
查询剩余空间 - 调用
trimCache()
清理缓存 - 实现文件LRU缓存策略
文件路径兼容性处理
// 兼容不同SDK版本的文件路径获取 File externalFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), "appfile.txt"); if (!externalFile.exists()) { // Android 10+需要使用Scoped Storage API }
相关问题与解答
Q1:如何动态申请存储权限并处理用户拒绝情况?
A:应使用shouldShowRequestPermissionRationale()
检测是否首次申请,若被永久拒绝则引导至设置页面,示例代码:
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { // 显示权限说明对话框 } else { // 直接申请权限 }
Q2:Android 11沙盒机制下如何访问任意文件?
A:可通过以下两种方式突破限制:
- 使用
Storage Access Framework
(SAF)选择文件 - 申请
MANAGE_EXTERNAL_STORAGE
特权权限(需Google Play审核