返回

Android SD卡文件操作(Android 13 适用)

Android

Android SD 卡文件操作指南:充分利用您的存储空间

了解 Android 13 的存储变更

Android 13 引入了 Scoped Storage,这是一种新的存储机制,旨在增强用户对应用程序存储访问的控制。在 Android 13 及更高版本中,应用程序通常只能访问其自己的专用存储区域。但是,对于特定情况,可以通过请求 MANAGE_EXTERNAL_STORAGE 权限来访问 SD 卡。

请求存储权限

在 Android 13 及更高版本中,应用程序需要请求存储权限才能访问 SD 卡。使用 requestPermissions() 方法请求 MANAGE_EXTERNAL_STORAGE 权限。如果用户授予权限,您的应用程序将能够访问 SD 卡。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    requestPermissions(new String[]{Manifest.permission.MANAGE_EXTERNAL_STORAGE}, MY_PERMISSION_REQUEST_CODE);
}

创建和写入文件

获得存储权限后,您可以开始创建和写入文件。使用 openFileOutput() 方法创建并打开一个文件,然后使用 write() 方法写入数据。

FileOutputStream fos = openFileOutput("myfile.txt", Context.MODE_PRIVATE);
fos.write("Hello world!".getBytes());
fos.close();

读取文件内容

要读取文件的内容,请使用 openFileInput() 方法打开文件,然后使用 read() 方法读取数据。

FileInputStream fis = openFileInput("myfile.txt");
byte[] data = new byte[1024];
int bytesRead = fis.read(data);
String text = new String(data, 0, bytesRead);
fis.close();

处理文件操作中的错误

文件操作可能会产生各种错误,例如文件不存在、存储空间不足或权限不足。使用 try-catch 语句捕获这些错误并做出适当的响应。

try {
    FileOutputStream fos = openFileOutput("myfile.txt", Context.MODE_PRIVATE);
    fos.write("Hello world!".getBytes());
    fos.close();
} catch (FileNotFoundException e) {
    // 文件不存在
} catch (IOException e) {
    // I/O 错误
}

兼容 Android 13 的解决方案

如果您需要同时支持 Android 13 及更低版本的设备,请使用兼容 Android 13 的解决方案。使用 getExternalFilesDir()getExternalStoragePublicDirectory() 方法获取 SD 卡上的公共存储目录,然后使用这些目录创建和写入文件。

File directory = getExternalFilesDir("my_app");
File file = new File(directory, "myfile.txt");
FileOutputStream fos = new FileOutputStream(file);
fos.write("Hello world!".getBytes());
fos.close();

注意事项

在执行文件操作时,请记住以下几点:

  • 在 Android 13 及更高版本中,应用程序通常只能访问其自己的专用存储区域,除非用户明确授予权限。
  • 在 Android 13 及更低版本的设备上,可以使用 getExternalFilesDir()getExternalStoragePublicDirectory() 方法获取 SD 卡上的公共存储目录。
  • 文件操作可能会产生各种错误,请使用 try-catch 语句捕获这些错误并做出适当的响应。

常见问题解答

  • 如何检查应用程序是否有存储权限?
if (ContextCompat.checkSelfPermission(this, Manifest.permission.MANAGE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
    // 应用程序有权限
} else {
    // 应用程序没有权限
}
  • 如何处理文件不存在的错误?
try {
    FileInputStream fis = openFileInput("myfile.txt");
    // 文件不存在时抛出 FileNotFoundException
} catch (FileNotFoundException e) {
    // 文件不存在,处理错误
}
  • 如何释放文件资源?

在使用完文件后,请务必使用 close() 方法释放文件资源。

FileOutputStream fos = openFileOutput("myfile.txt", Context.MODE_PRIVATE);
// ... 写入数据
fos.close(); // 释放文件资源
  • 如何将文件从 SD 卡复制到应用程序的专用存储区域?

您可以使用 FileUtils.copyFile() 方法将文件从 SD 卡复制到应用程序的专用存储区域。

File srcFile = new File(getExternalFilesDir("my_app"), "myfile.txt");
File destFile = new File(getFilesDir(), "myfile.txt");
FileUtils.copyFile(srcFile, destFile);
  • 如何将文件从应用程序的专用存储区域复制到 SD 卡?

您可以使用 FileUtils.copyFile() 方法将文件从应用程序的专用存储区域复制到 SD 卡。

File srcFile = new File(getFilesDir(), "myfile.txt");
File destFile = new File(getExternalFilesDir("my_app"), "myfile.txt");
FileUtils.copyFile(srcFile, destFile);

结论

通过遵循本指南,您可以自信地在 Android 设备上保存和读取本地 SD 卡文件,无论使用的是 Android 13 还是更低版本。通过充分利用您的存储空间,您可以创建功能更强大、用户体验更好的应用程序。