首页 > 解决方案 > 在 Mediastore Uri 和 DocumentFile Uri 之间转换时出错:“无法确定是否为子项”

问题描述

这是场景:

我正在编写一个应用程序,它要求用户打开一个目录,并且该应用程序正在加载目录中的所有图像(然后执行移动或删除等基本操作)。因为listFiles速度很慢,我正在使用MediaStoreAPI 获取图像(查询_data从 received 获取的列DocumentFile Uri)并在需要时将它们转换DocumentFile为如下:

// Given MediaStore Uri:
val docUri = MediaStore.getDocumentUri(context, mediaUri)
return DocumentFile.fromSingleUri(context, docUri)

问题是,有时我会得到:

java.lang.IllegalArgumentException: Failed to determine if primary:DirectoryA/image.jpg is child of primary:DirectoryB/image.jpg: java.io.FileNotFoundException: Missing file for primary:DirectoryB/image at /storage/emulated/0/DirectoryB

...当我尝试在目录中获取DocumentFile一些内容时(第一行)。出于某种原因,Android 会尝试检查是否应该在不同的目录中?(也许图像在某个时候存在?)。image.jpgDirectoryAimage.jpg

顺便说一句,当我移动我正在使用的图像时DocumentsContract.moveDocument

*应用程序是 Android 10+。

更新:我如何查询 MediaStore:

context.contentResolver.query(
    MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
    arrayOf(MediaStore.Images.ImageColumns._ID, MediaStore.Images.ImageColumns.DATA),
    MediaStore.Images.ImageColumns.DATA + " like ? and " + MediaStore.Images.ImageColumns.DATA + " not like ?",
    arrayOf("$path/%", "$path/%/%"),
    null
)

这适用于 Android Q,带有targetSdkVersion 29.

标签: androidkotlin

解决方案


推荐阅读