它在SDK 29之前就存在了,但现在是必需的。
我的应用创建了一个级联的文件夹来管理它的内容。所有的内容都意味着存储在用户选择的任何文件夹中,但是对于生活地狱,我无法弄清楚,如何在Uri文件夹中创建一个文件夹并稍后访问它(因为存储访问框架- ACTION_OPEN_DOCUMENT_TREE)。
我尝试使用DocumentFile
创建一个文件夹和一个文件,它工作得很好(现在也不工作),另一方面,当我将一些文件复制到该目录时,它禁止我以任何方式访问这些文件。我需要访问这些文件,即使我移动它们,因为我在不同的设备上有旧内容的副本,但现在它无法访问这些文件。
还有一件事要添加,我第一次尝试记录文件名时它工作了。但是当我再次运行代码时,它给了我关于不使用ACTION_OPEN_DOCUMENT
来获取这些文件引用的安全异常。但它应该给我选择目录的全部权限,对吧?
创建子文件/子文件夹的代码:
DocumentFile file = DocumentFile.fromTreeUri(context, data.getData());
public DocumentFile getChild(String name) {
DocumentFile child = file.findFile(name);
if (name.matches(".*\..{3,4}$")) {
String mimetype = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
name.substring(name.lastIndexOf('.')));
return child != null ? child : file.createFile(
mimetype == null ? "application/dat" : mimetype, name);
}
return child != null ? child : file.createDirectory(name);
}
任何我找不到的手册的参考都会有帮助。
编辑完毕,您需要在文件夹中创建任何内容时添加getflags。
final int takeFlags = intent.getFlags() &
(Intent.FLAG_GRANT_READ_URI_PERMISSION |
Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
对象t是一个共享首选项,只是为了保存字符串uri,您可以切换它们。Out for your object.
当你需要创建文件夹时使用这个,使用public void作为函数
Intent intent = new
Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent,
NEW_FOLDER_REQUEST_CODE);
使用此命令获取已创建文件夹
的活动结果if (_resultCode == Activity.RESULT_OK) {
if (_requestCode ==
NEW_FOLDER_REQUEST_CODE) { if (_data !=
null) { Uri currentUri =
_data.getData();
DocumentFile pickedDir =
DocumentFile.fromTreeUri(this,
currentUri);
DocumentFile newDir =
pickedDir.createDirectory("MyFolder");
final int takeFlags =
Intent.FLAG_GRANT_READ_URI_PERMISSION |
Intent.FLAG_GRANT_WRITE_URI_PERMISSION;
} } }