11

我正在编写一个应用程序,该应用程序可以删除可能会或可能不会在任何一种媒体库(例如音乐或图片)中列出的文件。虽然我可以使用该MediaScannerConnection.scanFile方法文件添加到媒体库,但似乎没有任何调用来通知服务该文件已被删除。将不再存在的文件的路径发送给它也不会产生所需的行为。我应该如何从库中删除 Android 存储中不再存在的项目?

4

5 回答 5

14

我能够使用这两个问题的点点滴滴把一个方法放在一起

  1. MediaStore.Audio.Playlists.Members.getContentUri 的 String 'volumeName' 参数指的是什么?
  2. 如何在 Android 上刷新 MediaStore?

基本上我只是对每个 MediaStore 类型(音频、视频和图像)运行一个查询,通过路径选择并删除我找到的任何记录。

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
}

我不完全确定这样做有多安全,但这是我迄今为止发现的唯一解决方案,并且一些初步测试似乎正在发挥作用。如果有人对此方法或执行此功能的更好方法有任何进一步的信息,我邀请其他人提交其他答案。

于 2011-12-05T02:15:20.070 回答
8

像馅饼一样简单:每当您添加文件时,请MediaStore ContentProvider使用

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

删除:只需使用

getContentResolver().delete(Uri.fromFile(fileToDeleteFromMediaStore), null, null)
于 2013-02-13T08:49:35.703 回答
8

Spencer Ruport 的答案是正确的,但您不需要查询并打开游标即可删除。因此,对于一个音乐文件,代码很简单:

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我想评论Spencer Ruport的答案,但还没有足够的声誉。

于 2014-10-16T11:39:27.333 回答
6

以下对我很有效。您可以使用它删除或添加文件。

MediaScannerConnection.scanFile(
                context,
                new String[]{fileToDelete, fileToAdd},
                null, null);
于 2015-02-28T08:39:08.837 回答
0

可用的方法是从库中删除该项目。这篇文章详细表达了如何添加到媒体库或从媒体库中删除。 http://androidyue.github.io/blog/2014/01/19/scan-media-files-in-android/ 希望这可以帮助你。

于 2014-01-19T13:56:01.023 回答