刷新媒体库的几种方式

2,939 阅读1分钟

操作MediaStore

/**
 * 向 MediaStore 中插入图片数据,并产生一个缩略图
 * 不需要指定路径,会自动将图片保存至 Picture 目录下
 */
public static void MediaStore.Image.Media.insertImage(
    ContentResolver cr, Bitmap source, String title, String description)

/**
 * 向 MediaStore 中插入图片数据,并产生一个缩略图
 * 指定路径,会保存图片到指定路径,并复制一份保存至 Picture 目录下,不推荐
 */
public static void MediaStore.Image.Media.insertImage(
    ContentResolver cr, String imagePath, String name, String description)

发送广播

在 Android 4.4 之前可以使用 ACTION_MEDIA_MOUNTED 来刷新,但是在 Android 4.4 之后该广播只可以由系统进行广播,APP 只能进行监听,因此改为用 ACTION_MEDIA_SCANNER_SCAN_FILE 来刷新媒体库

添加后刷新

String path = "文件绝对路径";
String uri = Uri.fromFile(new File(path));
// 或者String uri = Uri.parse(path);
// 或者String uri = new File(path).toURI().toString;
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri);
sendBroadcast(intent);

注意这里的 uri 必须以 Environment.getExternalStorageDirectory() 的返回值开头。

删除后刷新
不能像添加时的操作去刷新,因为源码中判断了文件路径为空或无效则返回,因此使用 ContentResolver 来进行刷新:

contentResolver.delete(Images.Media.EXTERNAL_CONTENT_URL,
    Images.Media.DATA + "=?", new String[]{file.getAbsolutePath()});

操作 MediaScannerConnection 类

/**
 * 可传递多个路径,MimeType 必填,且不能为通配符 */* 或 null
 */
MediaScannerConnection.scanFile(Context context, String[] paths, 
    String[] mimeTypes, OnScanCompleteListener callback)