2

由于 Android 通过范围存储访问强制使用存储访问框架,因此应用程序无法使用直接 java.io.file 操作来移动文件。

目的是将某些从 mediastore 数据库中查询到的特定媒体项移动到另一个特定目录(源文件的同一分区),该目录用户已授予应用程序 rw 权限。

但是,当我尝试使用方法创建 DocumentFile 实例时

DocumentFile fromTreeUri(@NonNull Context context, @NonNull Uri treeUri)

在这种情况下,创建的实例的父 DocumentFile 为 null。以及方法

Uri moveDocument(@NonNull ContentResolver content, @NonNull Uri sourceDocumentUri, @NonNull Uri sourceParentDocumentUri, @NonNull Uri targetParentDocumentUri)

需要源父级移动文档文件。我知道我可以通过读/写 IO 流将源复制到目标,但这并不有效。那么,我怎样才能以推荐的方式做到这一点呢?

另一个问题是,如果有办法将内容从 mediastore 移动到另一个地方,如何在不删除底层文件实体的情况下将其从数据库中删除?

4

1 回答 1

1

DocumentContract.moveDocument()仅从 API 24 开始可用。因此,要支持旧版本,您可以使用此。它可以帮助您像这样移动和复制文件:

val file: DocumentFile = // from tree URI
file.moveFileTo(context, targetFolder, callback)
file.copyFileTo(context, targetFolder, callback)

// For media
val media = MediaFile(context, mediaUri)
media.moveTo(context, targetFolder, callback)
media.copyTo(context, targetFolder, callback)

moveTo()DocumentContract.moveDocument()考虑到它的快速性能,尽可能使用它。

于 2020-12-22T17:30:17.880 回答