Android:如何使用SAF(存储访问框架)将文件移动到另一个文件夹,以及如何列出显示名称的文件?

时间:2019-11-20 06:42:18

标签: android storage-access-framework

由于Google试图强制应用程序使用SAF进行存储访问,因此我试图使我的应用程序适应使用SAF来替换Java文件io api。

我花了很多时间研究SAF API(主要是DocumentFile和DocumentContract类),但是仍然有一些困难。

第一个是如何将文件移动到另一个目录? DocumentFile确实有一种重命名文件的方法,但这只是文件的显示名称。如果文件太大而又不想复制,该如何将文件移动到另一个文件夹。假设src和dst在同一分区上。

第二个问题是如何有效列出子文件。我检查了source code,发现DocumentFile.listFiles()仅查询具有单个投影[ID]的子文件。之后,当我想在列表视图中显示文件的名称时,对DocumentFile.getName()的调用将通过内容解析器再次触发每个文件的另一个查询。这对代码的性能有巨大的影响。尤其是当我尝试按名称对DocumentFile数组进行排序时,超过30个文件将花费600 + ms,这远远超出了可接受的范围。我怀疑我是否使用了正确的API集。谁能指出一种更好的方法来列出带有名称(和其他属性)的文件?

1 个答案:

答案 0 :(得分:0)

Simple Storage 是一个跨 API 级别简化 SAF 的库。假设您要将 MP4 文件从外部存储中的目录 Video 移动到 SD 卡中的目录 Others。让我们假设 AAAA-BBBB 作为 SD 卡的存储 ID:

val file = DocumentFileCompat.fromSimplePath(context, basePath = "Video/Infinity War.mp4")

// To move file:
file.moveTo(context, targetStorageId = "AAAA-BBBB", targetFolderBasePath = "Others")

// To copy file:
file.copyTo(context, targetStorageId = "AAAA-BBBB", targetFolderBasePath = "Others")