Я пытаюсь переместить файл изображения со своей 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);
также, похоже, ничего не делает.