Удаление файла 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();
Картинки больше нет, но есть пустой заполнитель. Есть идеи?
8 ответов
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.
РЕДАКТИРОВАТЬ: Другие заявили, что это не работает на 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, возвращенный вам, когда вы вызываете insert.
Если вы не знаете идентификатор изображения, как требуется в ответе @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-cascade-file-delete-trigger, указанный файл также удаляется, если он существует.
Чтобы избежать этого, перед вызовом удаления необходимо изменить столбец MediaStore.Images.Media.DATA на несуществующий путь к файлу.
Это сработало для меня (проверено на 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 + "=?", New String[]{ Long.toString(id) });
Добавьте эту строку после File.delete();
:
MediaScannerConnection.ScanFile(this,new string[]{fileUrl.ToString()}, null, null);
Добавьте это сразу после удаления файла:
MediaScannerConnection.scanFile(context, arrayOf(imageURI.getPath()), null, null)
:)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
MediaScannerConnection.scanFile(context,new String[]{selectedVideoDelete}, null, null);
} else {
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
}