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

安卓开发存储路径

安卓开发存储路径详解

内部存储(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_STORAGEWRITE_EXTERNAL_STORAGE
    • 安卓11+需 MANAGE_EXTERNAL_STORAGE(仅针对外部存储全局管理)

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+安装应用后无法读取外部文件?

    安卓开发存储路径  第1张

    • 原因:安卓11+对 WRITE_EXTERNAL_STORAGE 权限收紧,需声明 MANAGE_EXTERNAL_STORAGE
    • 解决方案
      • 尽量避免直接操作公共目录,改用应用专属目录或 SAF。
      • 若必须访问公共目录,需引导用户手动授权管理权限。

相关问题与解答

问题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

0