Android的Media Scanner:如何删除文件?

Spe*_*ort 9 android android-mediascanner

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

Spe*_*ort 12

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

  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
}
Run Code Online (Sandbox Code Playgroud)

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


Ser*_*aev 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 } );
}
Run Code Online (Sandbox Code Playgroud)

PS我想评论Spencer Ruport的答案,但还没有足够的声誉.


Pas*_*cal 7

简单来说:无论何时添加文件,都可以让MediaStore Content Provider了解它

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(fileToAddInMediaStore)));
Run Code Online (Sandbox Code Playgroud)

对于删除:只使用getContentResolver()删除(Uri.fromFile(fileToDeleteFromMediaStore),NULL,NULL).

  • 你试过你的解决方案吗?我试过,这似乎不起作用. (2认同)

wis*_*slo 6

以下对我来说效果很好。您可以使用它删除或添加文件。

MediaScannerConnection.scanFile(
                context,
                new String[]{fileToDelete, fileToAdd},
                null, null);
Run Code Online (Sandbox Code Playgroud)

  • 这将在某些设备上创建零字节文件 (2认同)