Почему MediaStore не обновляется при сохранении образа на съемный носитель через SAF? - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь переместить файл изображения со своей getExternalFilesDir(null) на съемную SD-карту . Я использовал Storage Access Framework, чтобы получить доступ к SD-карте.

if (copy(context, sourceUri, targetUri)) return delete(context, sourceUri);

Сначала я копирую файл на SD-карту, и если он был успешно скопирован, я удаляю исходный файл из своей песочницы.

public static boolean copy(@NonNull Context context, @NonNull Uri sourceUri, @NonNull Uri targetUri) {
    InputStream inputStream = openInputStream(context, sourceUri);
    OutputStream outputStream = openOutputStream(context, targetUri);

    if (inputStream == null || outputStream == null) {
        if (inputStream != null) {
            try { inputStream.close(); }
            catch (IOException ignored) {}
        }

        if (outputStream != null) {
            try { outputStream.close(); }
            catch (IOException ignored) {}
        }
        return false;
    }

    try {
        byte[] buffer = new byte[4096];
        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }
        inputStream.close();
        outputStream.close();
        return true;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return false;
}

Я получаю targetUri, вызывая это:

Uri targetUri = DocumentsContract.createDocument(context.getContentResolver(), destinationUri, mimeType, filename);
// targetUri is content://com.android.externalstorage.documents/tree/3A3A-11FB%3A/document/3A3A-11FB%3AIMG_2711.gif

Файл успешно скопирован , но этот файл никогда не отображается ни в Google Фото, ни когда я сам запрашиваю MediaStore. Когда я перезагружаю устройство, все отображается.

Это воспроизводится не на всех устройствах, а на некоторых, таких как Mi A2 Lite на android 9.

Я думал, что поставщик контента отвечает за обновление всех записей для MediaStore. Есть ли способ обновить MediaStore самостоятельно?

Intent.ACTION_MEDIA_SCANNER_SCAN_FILE и MediaScannerConnection.scanFile не работают

EDIT : Когда я пытаюсь использовать getContentResolver (). Update () Я получаю java.lang.UnsupportedOperationException: Update not supported исключение.

Я пытаюсь обновить, используя следующий код:

final ContentValues vals = new ContentValues();
vals.put(DocumentsContract.Document.COLUMN_DISPLAY_NAME, "testImage.jpg");
context.getContentResolver().update(targetUri, vals , null, null);

Интересно, что ContentValues не может быть нулевым, даже если они @Nullable. Если они равны null, будет сгенерировано следующее исключение:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.content.ContentValues.writeToParcel(android.os.Parcel, int)' on a null object reference
        at android.content.ContentProviderProxy.update(ContentProviderNative.java:566)
        at android.content.ContentResolver.update(ContentResolver.java:1723)
        ...

context.getContentResolver().refresh(targetUri, null, null); также, похоже, ничего не делает.

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