Не удается обновить MediaStore на Android 10 - PullRequest
5 голосов
/ 23 февраля 2020

Я обновлял метаданные в MediaStore через ContentResolver, но это больше не работает с Android Q (API 29). Следующий код дает мне предупреждение, и описание не обновляется:

ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DESCRIPTION, "Some text");

int res = getContext().getContentResolver().update(
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
        values,
        MediaStore.Images.Media._ID + "= ?", new String[]{sImageId});

android .process.media W / MediaProvider: Игнорирование мутации описания из com.example. android .someapp.app

В этом посте Medium описано , как Google изменил API для доступа и обновления файлов , но как насчет обновления только метаданных ? Похоже, предупреждение говорит мне, что Google больше не хочет разрешать сторонним приложениям использовать MediaStore, и я также нашел источник предупреждения: https://android.googlesource.com/platform/packages/providers/MediaProvider/+/master/src/com/android/providers/media/MediaProvider.java#2960

Кто-нибудь знает, почему обновление не работает на Android 10, и каков правильный обходной путь?

1 Ответ

3 голосов
/ 28 февраля 2020

ОК, с помощью joakimk я нашел проблему.

Чтобы обновить отдельный фрагмент контента, вам нужно использовать Uri, который указывает на этот отдельный фрагмент контента:

    ContentValues values = new ContentValues();
    values.put(MediaStore.Images.Media.DESCRIPTION, text);

    Uri uri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imgId);

    int res = getContentResolver().update(uri, values, null, null);

Эта форма update() будет выбрасывать RecoverableSecurityException. Вы можете поймать это и вызвать системное диалоговое окно , которое должно дать вам разрешение на успешное обновление этого содержимого.

В основном, логика c, которая решает, бросать ли RecoverableSecurityException, зависит на самом Uri, имеющем идентификатор содержимого, а не в предложении WHERE. Побочным эффектом этого является то, что вы не можете изменять более одного фрагмента контента одновременно, хотя новые API Android R для этого могут помочь.

Я тестировал это на Android 10 и Android R DP1.

...