Как принудительно обновить обновление MediaStore для файла, используя только его Content Uri - PullRequest
5 голосов
/ 22 марта 2019

В Android Q поле MediaStore.Files.FileColumns.DATA устарело , и может иметь значение Null или приложения не имеют прав на Прочитайте его при нацеливании на такую ​​версию ОС, поэтому предпочтительнее работать с использованием только Uri содержимого файла.

Поскольку MediaScannerConnection принимает только пути к файлам, я обнаружил, что для Android Q это больше не вариант.

Каким будет способ принудительного автоматического MediaStore обновления / повторного сканирования одного файла, не зная его реального пути и , используя только его Uri ? Намерение не в том, чтобы даже попытаться найти реальный путь и полагаться только на Ури.

Учтите, что Uri для принудительного обновления является мультимедийным контентом Uri (не SAF Uri ).
Пример: content: // media / external / images / media / 123

Решение не должно заключаться в повторном сканировании всего хранилища или его повторном монтировании / подключении, поскольку это приведет к снижению производительности в нашем рабочем процессе и сделает его полностью непригодным для использования.

А поскольку целью является использование только Uri, то следует избегать принудительного сканирования любого конкретного каталога файлов, что также может оказать влияние, если в нем содержится много файлов, и подразумевает, что должен быть разрешен реальный путь к каталогу. от Ури, что не вариант.

UPDATE:

Мы попробовали с неудачными результатами метод ContentResolver.refresh , представленный в Android O, но этот метод вообще не выполняет никакого обновления, когда дело доходит до медиа-контента. в таком формате, как: content: // media / external / images / media / 123

final ContentResolver resolver = context.getContentResolver();
resolver.refresh(uri, null, null);

1 Ответ

1 голос
/ 16 апреля 2019

В настоящее время я также пытаюсь изменить дизайн своего приложения, чтобы использовать только URI, а не использовать все хакерские решения для преобразования их в пути к файлам (например, угадывание пути на основе прав доступа uri и т. Д.) Ранее я использовал MediaScannerConnection.scanFile(...), который работал без изъянов, но, как вы, вероятно, уже попробовали, это не работает с URI.

Я нахожу успех, вручную обновляя URI MediaStore новыми данными, подобными этим:

public void updateMediaStore(final Uri content, final String title) {
    final ContentValues values = new ContentValues();
    values.put(MediaStore.Audio.AudioColumns.TITLE, title);
    // ... the rest of your data
    cr.update(res, values, null, null);
}

Тем не менее, кажется, что упущение не позволяет повторно сканировать определенный файл.Например, если этот URI пришел откуда-то еще, например, на SD-карте через SAF, вам придется сначала найти его в MediaStore, прежде чем обновлять.

...