在Android 10和11上,使用maxSdkVersion
标记的WRITE_EXTERNAL_STORAGE
权限会引发警告。为了解决这个问题,你可以使用存储访问框架(Storage Access Framework)来请求访问外部存储。
下面是一个解决方法的代码示例:
WRITE_EXTERNAL_STORAGE
权限的声明:
private static final int REQUEST_CODE_STORAGE_PERMISSION = 1;
// 请求访问外部存储
private void requestStoragePermission() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, REQUEST_CODE_STORAGE_PERMISSION);
}
// 处理权限请求结果
@Override
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
super.onActivityResult(requestCode, resultCode, resultData);
if (requestCode == REQUEST_CODE_STORAGE_PERMISSION && resultCode == Activity.RESULT_OK) {
Uri treeUri = resultData.getData();
// 这里可以保存获取到的treeUri,以后可以使用它来访问外部存储
}
}
onActivityResult
方法中,你可以保存获取到的treeUri
,以后可以使用它来访问外部存储。例如,你可以使用DocumentFile
类来创建、读取、写入文件,例如:// 使用treeUri访问外部存储
private void accessExternalStorage(Uri treeUri) {
DocumentFile pickedDir = DocumentFile.fromTreeUri(context, treeUri);
// 创建文件夹
DocumentFile newDir = pickedDir.createDirectory("MyFolder");
// 创建文件
DocumentFile newFile = newDir.createFile("text/plain", "MyFile.txt");
// 写入文件
OutputStream outputStream = context.getContentResolver().openOutputStream(newFile.getUri());
outputStream.write("Hello, World!".getBytes());
outputStream.close();
// 读取文件
InputStream inputStream = context.getContentResolver().openInputStream(newFile.getUri());
// 处理文件内容...
inputStream.close();
}
注意:在Android 10和11上,访问外部存储需要用户授予权限。当你调用requestStoragePermission
方法时,系统会打开一个文件选择器,让用户选择外部存储的目录。用户选择后,系统会将选择的目录的URI传递给onActivityResult
方法中的resultData
参数。
希望这个解决方法对你有帮助!