我正在编写一个应用程序,可以删除可能或可能未列在任何一种媒体库中(例如音乐或图片)的文件。虽然我可以使用MediaScannerConnection.scanFile
方法将文件添加到媒体库中,但似乎没有调用通知服务已删除文件的方法。向服务发送不再存在的文件路径也无法产生预期的行为。那么我该如何从Android存储中删除不存在的库项呢?
我正在编写一个应用程序,可以删除可能或可能未列在任何一种媒体库中(例如音乐或图片)的文件。虽然我可以使用MediaScannerConnection.scanFile
方法将文件添加到媒体库中,但似乎没有调用通知服务已删除文件的方法。向服务发送不再存在的文件路径也无法产生预期的行为。那么我该如何从Android存储中删除不存在的库项呢?
我能够根据这两个问题的部分内容编写出一个方法。
基本上,我只是对每种 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
}
我不完全确定这样做是否安全,但这是我迄今为止找到的唯一解决方案,经过一些初步测试似乎可以工作。如果有人对这种方法有进一步的信息或更好的执行此功能的方法,请提交其他答案。
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 } );
}
P.S.我想评论Spencer Ruport的答案,但还没有足够的声望。
易如反掌: 每当你添加一个文件,让MediaStore
ContentProvider
知道它的存在即可。
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(fileToAddInMediaStore)));
删除操作:只需使用
getContentResolver().delete(Uri.fromFile(fileToDeleteFromMediaStore), null, null)
MediaScannerConnection.scanFile(
context,
new String[]{fileToDelete, fileToAdd},
null, null);
可用的方法是从库中删除该项。 本文详细介绍了如何添加到或从媒体库中删除。 http://androidyue.github.io/blog/2014/01/19/scan-media-files-in-android/ 希望这能帮到您。
select += MediaStore.MediaColumns.DATA + "like ?";
并在我的路径字符串列表末尾追加了%
。这将返回特定文件夹中的所有文件。 - Diederik