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

安卓存储本地文件

安卓存储本地文件可存内部(私有/公有)或外部存储,需申请权限,Android 10后外部存储访问受限,推荐用Storage Access Framework或MediaStore API,或通过File类操作内部存储

安卓存储本地文件的方式

安卓系统提供多种存储本地文件的途径,主要分为内部存储外部存储两类,具体实现方式根据Android版本有所不同。

内部存储(Internal Storage)

  • 特点:应用私有,无需申请权限,数据默认加密。
  • 适用场景:存储敏感配置、缓存文件等。
  • 路径/data/data/<包名>/files/
  • 操作方法
    File internalFile = new File(getFilesDir(), "example.txt");
    try (FileOutputStream fos = new FileOutputStream(internalFile)) {
        fos.write("Hello Internal".getBytes());
    }

外部存储(External Storage)

  • 特点:公共目录,需申请权限,Android Q(API 29)后受Scoped Storage限制。
  • 路径
    • 公共目录:/storage/emulated/0/Download/
    • 应用专属目录:/storage/emulated/0/Android/data/<包名>/
  • 权限要求
    | 权限名称 | 作用 | 适用场景 |
    |——————————|——————————|————————|
    | READ_EXTERNAL_STORAGE | 读取外部存储文件 | Android 10以下 |
    | WRITE_EXTERNAL_STORAGE | 写入外部存储文件 | Android 10以下 |
    | MANAGE_EXTERNAL_STORAGE | 管理所有外部存储文件(Android 11+) | 需引导用户手动开启 |

Scoped Storage(Android Q+)

  • 限制:应用只能访问自身创建的文件或特定公共目录。
  • 解决方案
    • 使用MediaStore API保存媒体文件。
    • 通过Storage Access Framework(SAF)获取用户授权的目录。

代码示例:存储文件到公共目录

动态申请权限(Android 10以下)

<!-AndroidManifest.xml -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
// 运行时申请权限
ActivityCompat.requestPermissions(this, 
    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);

写入文件到公共下载目录

File publicDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
File file = new File(publicDir, "example.txt");
try (FileOutputStream fos = new FileOutputStream(file)) {
    fos.write("Hello Public".getBytes());
} catch (IOException e) {
    e.printStackTrace();
}

兼容Android Q+的存储方式

// 使用MediaStore保存图片(Android Q+)
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DISPLAY_NAME, "example.png");
values.put(MediaStore.Images.Media.MIME_TYPE, "image/png");
Uri uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
try (OutputStream os = contentResolver.openOutputStream(uri)) {
    // 写入图片数据到os
}

常见问题与解决方案

问题 解决方案
文件路径不存在 检查路径是否正确,或使用file.mkdirs()创建多级目录。
权限被拒绝(Android 10+) 使用MediaStoreSAF替代直接文件路径访问,并申请MANAGE_EXTERNAL_STORAGE权限。
文件无法读取(Android Q+) 通过ContentResolver查询文件URI,或使用SAF获取用户授权的目录。

相关问题与解答

问题1:如何判断文件是否存储成功?

解答:可通过File.exists()检查文件是否存在,或捕获IOException判断写入是否异常。

if (file.exists()) {
    Log.d("Storage", "File saved successfully!");
} else {
    Log.e("Storage", "File saving failed.");
}

问题2:如何在Android 11+中请求MANAGE_EXTERNAL_STORAGE权限?

解答:需引导用户进入系统设置页手动开启:

Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
startActivity(intent);

注意:Google Play可能拒绝频繁申请此权限的应用,需谨慎

0