Android媒体库更新问题

这篇博文是从本人过去的 github pages 博客迁移过来,时间上会比较古老。

简介

Android 媒体库(MediaProvider)实际上是个 Provider。

Android 4.4 以后,当系统启动完成SD 卡插拔或者接收到 Intent.ACTION_MEDIA_SCANNER_SCAN_FILE 广播时,系统会扫描文件系统中的数据,将新增和删除的文件信息更新到这个 MediaProvider 中。其他应用如果要使用,直接读取这个 MediaProvider 就可以直接取得系统中媒体文件的信息。

背景

笔者遇到的问题是开发的拍照应用在拍照之后,MediaProvider 没有更新新增的照片文件,图库中也看不到新增的照片。

调查过程

从触发更新 MediaProvider 的条件来看,拍照之后应该发送广播Intent.ACTION_MEDIA_SCANNER_SCAN_FILE通知系统去更新 MediaProvider,而开发的相机应用没有进行这个动作。

笔者写了一个类用来发送Intent.ACTION_MEDIA_SCANNER_SCAN_FILE广播:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class MediaUtils {
private static final String TAG = "MediaUtils";
private static MediaUtils sInstance;
private Context mContext;

public static synchronized MediaUtils getInstance() {
Log.d(TAG, "getInstance()");
if (sInstance == null) {
sInstance = new MediaUtils();
}
return sInstance;
}

private MediaUtils() {}

/**
* set Context: send BroadCast need a Context.
* @param context context
*/
public void setContext(@NonNull Context context) {
Log.d(TAG, "setContext()");
mContext = context;
}

/**
* update Media.
* @param filePath path of updated file
*/
public void updateMedia(@NonNull String filePath) {
Log.d(TAG, "updateMedia() filePath:" + filePath);
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intent.setData(Uri.fromFile(new File(filePath)));
mContext.sendBroadcast(intent);
}
}

在拍照Activity取得MediaUtils的实例并调用setContext方法传入Activity本身。

在拍照之后取得 MediaUtils 的实例并调用updateMedia方法将新增照片的路径传入,相册里就可以显示新增的照片了。

结论

如果想要应用产生的图片或者视频被其他应用找到并使用,必须要发送Intent.ACTION_MEDIA_SCANNER_SCAN_FILE广播。

发布于

2019-09-21

更新于

2025-07-07

许可协议

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×