Android 10: Как программно удалить элемент MediaStore и связанные с ним данные в файловой системе? - PullRequest
1 голос
/ 16 марта 2020

Я обновляю свое приложение для использования функции Scoped Storage, представленной в Android 10.

Мое приложение работает с MediaStore и отображает изображения, видео и аудиофайлы, а также предоставляет пользователю возможность удалить элемент.

Что я делал ранее для удаления файла:

  1. Получил путь из MediaStore.MediaColumns.DATA
  2. Использовал new File(path).delete() для удаления этого файла
  3. Обновление MediaStore вручную

Теперь, когда MediaStore.MediaColumns.DATA недоступен, я перенес удаление элементов из MediaStore с помощью ContentResolver.delete ()

Например, у меня есть URI элемент: content://media/external/images/media/502 (это действительный uri, я отображаю его эскиз в сетке). Не имеет значения, вставил ли я этот элемент в MediaStore или какое-то другое приложение.

Я использую context.getContentResolver().delete(uri, null, null). Он либо удаляется (возвращает 1 строку), либо ловит RecoverableSecurityException, чтобы использовать startIntentSenderForResult(), чтобы получить доступ к текущему URI, а затем использует те же самые getContentResolver().delete(), чтобы удалить его в onActivityResult() и , затем , получая успешное удаление.

В любом случае этот элемент удаляется из MediaStore и не отображается ни в результате, когда я запрашиваю MediaStore для изображений, ни в других приложениях.

НО этот файл существует в файловой системе (проверено с помощью SAF и различных файловых менеджеров (Google Files, Total Commander)) *

Иногда (зависит от версии Android и тип мультимедиа) эти элементы возвращаются в MediaStore после перезагрузки телефона (или после открытия Google Photos - сканируется файловая система)

Например: Android 10 в моих Google Pixel и Google Pixel 3a XL работает как описано выше для изображений / видео / аудио, но Android 9 на Xiaomi Mi A2 Lite ведет себя так же только с аудио-файлами, в то время как удаление изображений / видео в порядке.

У меня android:requestLegacyExternalStorage="false" в манифесте.

Есть ли способ заставить MediaStore также удалить данные в файловой системе? Почему файл в файловой системе остался позади?

1 Ответ

0 голосов
/ 16 марта 2020

По моим наблюдениям принудительного удаления нет.

Я обычно добавляю несколько проверок, действительно ли файл был удален на Android Q, также невозможно удалить весь альбом без пользователя вручную. подтверждая каждый файл. это делает удаление файлов на устройстве для меня неинтересным

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...