Удаление файла Android оставляет пустое место в галерее

Я вставляю изображение через:

ContentValues values = new ContentValues(); values.put(Images.Media.TITLE, filename); values.put(Images.Media.DATE_ADDED, System.currentTimeMillis()); values.put(Images.Media.MIME_TYPE, "image/jpeg"); Uri uri = this.getContentResolver().insert(Images.Media.EXTERNAL_CONTENT_URI, values); 

Но когда я пытаюсь удалить

  File f = new File(imageURI); f.delete(); 

Изображение больше не существует, но пустой заполнитель. Есть идеи?

Solutions Collecting From Web of "Удаление файла Android оставляет пустое место в галерее"

У Android есть кеш, который отслеживает медиафайлы.

Попробуй это:

 sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory()))); 

Это заставляет службу MediaScanner запускаться снова, что должно удалить удаленное изображение из кеша устройства.

Похоже, вам также нужно добавить это разрешение на свой AndroidManifest.xml:

 <intent-filter> <action android:name="android.intent.action.MEDIA_MOUNTED" /> <data android:scheme="file" /> </intent-filter> 

Как указано в комментариях, принятый ответ использует много памяти. В то время как MediaScannerConnection не имеет метода «deleteFile», просто передайте старый путь к методу «scanFile» после удаления файла. Сканер для мультимедиа сканирует и удаляет носитель.

Протестирован на N5. Android 4.4.

EDIT: Другие заявили, что это не работает на 4.2

 new AsyncTask<Void, Void, Void>(){ @Override protected Void doInBackground(Void... params) { String filePath = recording.file.getAbsolutePath(); recording.file.delete(); MediaScannerConnection.scanFile(context, new String[]{filePath}, null, null); return null; } }.execute(); 

Вы также можете удалить изображение из галереи, используя:

GetContentResolver (). Delete (imageUri, null, null);

Просто убедитесь, что «imageUri» – это uri, возвращенный вам, когда вы вызываете вставку.

Если вы не знаете идентификатор изображения, как требуется в ответе @manisha и @Muhammad Waqas Khan, вы также можете удалить по имени файла

  String fullPathToFile = "/storage/sdcard0/DICM/test.jpg"; getContentResolver().delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, MediaStore.Images.Media.DATA + "=?", new String[]{ fullPathToFile } ); 

[Обновление 2016-06-16]

Опасность: это выглядит как «Удалить объект только из mediaDB». Поскольку в mediaDB есть SQLite-каскадный файл-delete-trigger, ссылочный файл также удаляется, если он существует.

Чтобы этого избежать, вы должны изменить столбец MediaStore.Images.Media.DATA на несуществующий путь к файлу перед вызовом delete.

Взято из: http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/content/ExternalStorage.html

Это сработало для меня (протестировано на HTC Desire, Android 2.3)

 // Tell the media scanner about the new file so that it is // immediately available to the user. MediaScannerConnection.scanFile(this,new String[] { file.toString() }, null, new MediaScannerConnection.OnScanCompletedListener() { public void onScanCompleted(String path, Uri uri) { Log.i("ExternalStorage", "Scanned " + path + ":"); Log.i("ExternalStorage", "-> uri=" + uri); } }); 

Используйте этот метод getContentResolver (). Delete (MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
MediaStore.Images.Media._ID + "=?", Новый String [] {Long.toString (id)});

Добавьте эту строку после File.delete(); :

 MediaScannerConnection.ScanFile(this,new string[]{fileUrl.ToString()}, null, null);