Медиа-сканер Android: как удалить файлы? - PullRequest
9 голосов
/ 05 декабря 2011

Я пишу приложение, которое удаляет файлы, которые могут или не могут быть перечислены в любом из типов медиа-библиотек, таких как музыка или изображения.Хотя я могу использовать метод MediaScannerConnection.scanFile для добавления файлов в библиотеку мультимедиа, похоже, нет никакого вызова, чтобы уведомить службу о том, что файл был удален.Отправка этого пути к файлу, который больше не существует, также не приводит к желаемому поведению.Как мне удалить элементы из библиотеки, которых больше нет в хранилище Android?

Ответы [ 5 ]

12 голосов
/ 05 декабря 2011

Я смог собрать метод, используя кусочки из этих двух вопросов

  1. Что такое аргумент String 'volumeName' MediaStore.Audio.Playlists.Members.getContentUri, ссылающийся на?
  2. Как обновить MediaStore на Android?

По сути, я просто запускаю запрос для каждого из типов хранилищ мультимедиа (аудио, видео и изображений), выбирая по пути и удаляя все найденные записи.

public static void RemoveAllForPaths(String[] paths, Context context)
{
    private static final String[] FIELDS = { MediaStore.MediaColumns._ID, MediaStore.MediaColumns.DATA, MediaStore.MediaColumns.TITLE };
    if(paths == null || paths.length == 0) return;
    String select = "";
    for(String path : paths)
    {
        if(!select.equals("")) select += " OR ";
        select += MediaStore.MediaColumns.DATA + "=?";
    }

    Uri uri;
    Cursor ca;

    uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    ca = context.getContentResolver().query(uri, FIELDS, select, paths, null);
    for(ca.moveToFirst(); !ca.isAfterLast(); ca.moveToNext()){
        int id = ca.getInt(ca.getColumnIndex(MediaStore.MediaColumns._ID));
        uri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id);
        context.getContentResolver().delete(uri, null, null);
    }
    ca.close();

    // More of the same just setting the URI to Video and Images
}

Я не совсем уверен, насколько это безопасно, но это единственное решение, которое я нашел до сих пор, и некоторые первоначальные испытания, похоже, работают. Я приглашаю других представить другие ответы, если у кого-либо есть какая-либо дополнительная информация об этом подходе или более эффективном методе для выполнения этой функции.

8 голосов
/ 16 октября 2014

Ответ Спенсера Рупорта правильный, но вам не нужно запрашивать и открывать курсор для удаления.Таким образом, для одного файла, который является музыкальным файлом, код выглядит так:

public void DeleteMP3FromMediaStore( Context context, String path )
{
    Uri rootUri = MediaStore.Audio.Media.getContentUriForPath( path );

    context.getContentResolver().delete( rootUri, 
        MediaStore.MediaColumns.DATA + "=?", new String[]{ path } );
}

PS Я хотел бы прокомментировать ответ Спенсера Рупорта, но у меня пока недостаточно репутации.

7 голосов
/ 13 февраля 2013

Easy as pie : всякий раз, когда вы добавляете файл, пусть MediaStore ContentProvider знает об этом, используя

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(fileToAddInMediaStore)));

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

getContentResolver().delete(Uri.fromFile(fileToDeleteFromMediaStore), null, null)
4 голосов
/ 28 февраля 2015

Следующее работает хорошо для меня. Вы можете удалить или добавить файлы, используя это.

MediaScannerConnection.scanFile(
                context,
                new String[]{fileToDelete, fileToAdd},
                null, null);
1 голос
/ 19 января 2014

Доступный метод - удалить элемент из библиотеки. В этом посте подробно рассказывается, как добавить или удалить из библиотеки мультимедиа. http://androidyue.github.io/blog/2014/01/19/scan-media-files-in-android/ Надеюсь, это поможет вам.

...