当前位置:首页 > 行业动态 > 正文

安卓存储管理

安卓存储体系结构

内部存储与外部存储

类型 路径示例 特性描述
内部存储 /data/data/包名 应用私有空间,包含数据库、SharedPreferences等,卸载自动清除
外部存储 /storage/emulated/0 公共空间,包含音乐、下载等目录,需申请权限访问
SD卡存储 /mnt/media_rw/SDCard 可移除存储介质,Android 11后启用沙盒机制(Scoped Storage)

特殊存储区域

  • Cache目录getCacheDir()获取,系统可自动清理
  • Files目录getFilesDir()获取,适合存放应用持久化文件
  • ExternalCacheDirgetExternalCacheDirs()获取,存储多媒体缓存文件

存储权限管理

运行时权限体系

// 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:可通过以下两种方式突破限制:

  1. 使用Storage Access Framework(SAF)选择文件
  2. 申请MANAGE_EXTERNAL_STORAGE特权权限(需Google Play审核
0