上一篇介绍如何获得权限uri
在获得权限uri后,我们也不能直接对外卡直接操作,可以通过documentFile来进行,创建,添加修改和删除等操作.documentFile创建文件的过程可能与以往的File不同,它是通过mimeType和displayName来表示文件的创建的.
在使用之前,我们要知道这是一个模拟File的程序类,它提供了文档树的模式,所以它会有很大的开销,为了节省我们的空间,我们要确定是不是要访问整个文档树,最小特权原则规定只应要求访问真正需要的文档。如果只需要用户选择单个文件,使用ACTION_OPEN_DOCUMENT或 ACTION_GET_CONTENT。如果想让用户选择多个文件,添加EXTRA_ALLOW_MULTIPLE。如果只需要用户保存单个文件,使用ACTION_CREATE_DOCUMENT。如果使用这些API,可以通过产生的getData()成 fromSingleUri(Context, Uri)与文档工作。
如果确实需要完全访问整个文档子树,首先启动ACTION_OPEN_DOCUMENT_TREE以允许用户选择目录。然后,通过所产生的getData()进入 fromTreeUri(Context, Uri)开始与用户选择的树工作。
在导航DocumentFile实例树时,始终可以使用 getUri()获取表示该对象的基础文档的Uri,以便与之一起使用openInputStream(Uri)等。
fromTreeUri(Context,Uri)可以帮助我们使用已经得到的uri创建documentFile对象.
fromSingleUri(Context, Uri)创建的是单个文档对象
documentFile = DocumentFile.fromTreeUri(this, uri);
使用createFile(String mimeType, String displayName)来创建文件,比如我们要创建一个111.txt的文本文档.
DocumentFile newFile = documentFile.createFile("text/plain", "111");
传入不同的mimeType来创建不同类型的文件,例如image/png
或 audio/flac.
displayName参数就是文件名,这样的话documentFile就会帮助我们创建相应类型的文件.
注:因为我获得uri权限是sd卡完整权限,所以创建文件的位置是卡的跟目录.能使用uri就用uri,不要documentFile一层套一层,很浪费资源的.
getContentResolver().openOutputStream(Uri uri)可以帮助我们得到创建完文件的数据流,可以直接对其进行写入操作.
OutputStream out = null;
try {
out = getContentResolver().openOutputStream(newFile.getUri());
out.write("A long time ago...".getBytes());
out.close();
} catch (Exception e) {
e.printStackTrace();
}
findFile(String displayName)能够查找到当前树下第一个匹配到的displayName名称的文件,已documentFile的形式返回.
DocumentFile file = documentFile.findFile("221111.txt");
documentFile有delete()方法来删除文件
newFile.delete();
getName()能够得到当前documentFile的文件名
Log.e(TAG, "newFile.getName();: "+newFile.getName());
getUri()能够得到当前documentFile的Uri
Log.e(TAG, "newFile.getUri();: "+newFile.getUri());
getType()能够获得当前documentFile的MIME类型,例如image/png
或 audio/flac
Log.e(TAG, "newFile.getType();:"+newFile.getType());
createDirectory(String displayName)能够在当前documentFile树下创建名称为displayName的文件夹
private void createDir(DocumentFile documentFile) {
DocumentFile testDir = documentFile.createDirectory("testDir");
}
getParentFile()能够获得当前文件的父文件
Log.e(TAG, "newFile.getParentFile();: "+newFile.getParentFile());
isDirectory()和isFIle()返回boolean,能够判断此documentFile是否是目录/文件
boolean directory = documentFile.isDirectory();
boolean file = documentFile.isFile();
listFiles()能够获得此目录数下的所有文件,已DocumentFile数组的形式返回
DocumentFile[] documentFiles = documentFile.listFiles();
renameTo(String displayName)能够重命名文件
boolean renameFile = newFile.renameTo("renameFile");