Android SD卡文件操作(Android 13 适用)
2023-02-14 18:49:34
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 还是更低版本。通过充分利用您的存储空间,您可以创建功能更强大、用户体验更好的应用程序。