在Android 8.0及以上的版本中,由于权限限制,需要通过Storage Access Framework(SAF)来进行SD卡的读写操作。下面是一个示例代码,演示了如何在SD卡中进行读写操作。
在AndroidManifest.xml文件中添加以下权限:
在Activity中添加以下代码:
private static final int REQUEST_CODE = 100;
// 请求SD卡读写权限
private void requestPermissions() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) {
Uri treeUri = data.getData();
DocumentFile pickedDir = DocumentFile.fromTreeUri(this, treeUri);
// 在SD卡中创建一个文件
DocumentFile file = pickedDir.createFile("text/plain", "example.txt");
// 向文件中写入内容
try {
OutputStream outputStream = getContentResolver().openOutputStream(file.getUri());
String content = "Hello, SD card!";
outputStream.write(content.getBytes());
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
// 从文件中读取内容
try {
InputStream inputStream = getContentResolver().openInputStream(file.getUri());
StringBuilder stringBuilder = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
stringBuilder.append(line).append("\n");
}
inputStream.close();
String content = stringBuilder.toString();
Log.d("SDCardExample", "File content: " + content);
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 调用requestPermissions()方法来请求权限
以上代码中,requestPermissions()方法会打开一个文件选择器,让用户选择SD卡的根目录。在onActivityResult()方法中,获取用户选择的目录的URI,并使用DocumentFile.fromTreeUri()方法将其转换为DocumentFile对象。然后,可以使用DocumentFile对象来创建文件、写入内容和读取内容。
请注意,由于权限限制,SAF不支持直接的文件路径操作,因此需要使用DocumentFile类来进行文件操作。