Вот сценарий:
Я пишу приложение, которое просит пользователя открыть каталог, и приложение загружает все изображения в каталоге (а затем выполняет основные операции c, такие как перемещение или удаление ). Поскольку listFiles
медленный, я получаю изображения, используя MediaStore
API (запрашивая столбец _data
, полученный из полученного 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
для некоторого image.jpg
в каталоге DirectoryA
( первая строка). По какой-то причине Android пытается проверить, должен ли image.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
.