Удаление файла Android оставляет пустую метку в галерее - PullRequest
18 голосов
/ 13 декабря 2010

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

    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 ]

15 голосов
/ 13 декабря 2010

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>
10 голосов
/ 18 февраля 2014

Как указано в комментариях, принятый ответ занимает много памяти. Хотя 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();
6 голосов
/ 08 января 2011

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

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

Просто убедитесь, что imageUri - это URIвернулся к вам, когда вы позвонили вставить.

3 голосов
/ 23 сентября 2015

Если вы не знаете идентификатор изображения, требуемый в ответе @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 для несуществующего пути к файлу перед вызовом delete.

2 голосов
/ 01 октября 2011

взято из: 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);
}
});
1 голос
/ 11 января 2017

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

MediaScannerConnection.ScanFile(this,new string[]{fileUrl.ToString()}, null, null);
1 голос
/ 24 апреля 2015

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

0 голосов
/ 25 октября 2018

Добавьте это сразу после удаления файла:

MediaScannerConnection.scanFile(context, arrayOf(imageURI.getPath()), null, null)

:)

...