项目中可能有这样的需求:下载或导入、导出的图片、音乐等媒体文件,需要马上能在图库或本地视屏播放器中显示出来,或者要能在媒体数据库中查询到媒体文件的相关信息,这时我们就得主动通知系统扫描新的媒体文件了。我整理了一个扫描的工具类,分享下。

  具体代码:

public class MediaScanner {

    private volatile static MediaScanner instance;

    private MediaScanner(){
} public static MediaScanner getInstace(){
synchronized (MediaScanner.class){
if(instance == null){
instance = new MediaScanner();
}
}
return instance;
} /**
* 扫描一个媒体文件
* @param filePath 要扫描的媒体文件
*/
public void scanFile(Context context, ScanFile filePath) {
List<ScanFile> filePaths = new ArrayList<ScanFile>(1);
filePaths.add(filePath);
scanFiles(context, filePaths);
} /**
* 扫描多个媒体文件
* @param filePaths 要扫描的文件列表
*/
public void scanFiles(Context context, List<ScanFile> filePaths){
SannerClient client = new SannerClient(context, filePaths);
client.connectAndScan();
} /**
* 媒体文件扫描对象构造器
*/
public static class ScanFile{ /**
* 要扫描的媒体文件路劲或包含媒体文件的文件夹路径
*/
public String filePaths; /**
* 要扫描的媒体文件类型 eg: audio/mp3 media/* application/ogg
* image/jpeg image/png video/mpeg video/3gpp
* ......
*/
public String mineType; public ScanFile(String filePaths, String mineType) {
this.filePaths = filePaths;
this.mineType = mineType;
}
} public class SannerClient implements
MediaScannerConnection.MediaScannerConnectionClient { /**
* 要扫描的文件或文件夹
*/
private List<ScanFile> scanFiles = null; /**
* 实际要扫描的单个文件集合
*/
private List<ScanFile> filePaths = null; private MediaScannerConnection mediaScanConn; public SannerClient(Context context, List<ScanFile> scanFiles) {
this.scanFiles = scanFiles;
mediaScanConn = new MediaScannerConnection(context, this);
} /**
* 连接MediaScanner并开始扫描
*/
public void connectAndScan(){
if(scanFiles != null && !scanFiles.isEmpty()){
this.filePaths = new ArrayList<ScanFile>(); //遍历取得单个文件集合
for(ScanFile sf : scanFiles){
findFile(sf);
} mediaScanConn.connect();
}
} private void findFile(ScanFile file){
File f = new File(file.filePaths);
if(f.isFile()){
filePaths.add(file); }else{
File[] fs = f.listFiles();
if(fs != null && fs.length > 0){
for(File cf : fs){
findFile(new ScanFile(cf.getAbsolutePath(), file.mineType));
}
}
}
} private void scanNext(){
if(filePaths != null && !filePaths.isEmpty()){
ScanFile sf = filePaths.remove(filePaths.size() - 1);
mediaScanConn.scanFile(sf.filePaths, sf.mineType); }else{
mediaScanConn.disconnect();
}
} @Override
public void onMediaScannerConnected() {
scanNext();
} @Override
public void onScanCompleted(String path, Uri uri) {
// TODO Auto-generated method stub
scanNext(); //媒体扫描完成可以配合EventBus等消息通讯工具发出通知,也可接收Intent.ACTION_MEDIA_SCANNER_FINISHED的广播
//EventBus.getDefault().post(new EventMediaScanCompleted(path));
}
}
}

  如果有扫描问题欢迎反馈。

android媒体文件扫描的更多相关文章

  1. Android调用MediaScanner进行新产生的媒体文件扫描

    有时候,我们拍了一张图片或录制了一段视频,图库应用默认没有将这些新产生的文件识别出来所以打开图库或视频播放器发现没有找到这些文件,需要调用MediaScanner扫描一下才会出来.从FFMPEG中找了 ...

  2. 深入Android媒体存储服务(二):磁盘扫描流程

    简介: 本文是<深入Android媒体存储服务>系列第二篇,简要介绍媒体存储服务扫描文件的流程.文中介绍的是 Android 4.2. Android 有一套媒体存储服务,进程名是 and ...

  3. Android媒体解码MediaCodec MediaExtractor学习

    Android提供了MediaPlayer播放器播放媒体文件,其实MediaPlyer只是对Android Media包下的MediaCodec和MediaExtractor进行了包装,方便使用.但是 ...

  4. Android媒体解码MediaCodec,MediaExtractor

    Android提供了MediaPlayer播放器播放媒体文件,其实MediaPlyer只是对Android Media包下的MediaCodec和MediaExtractor进行了包装,方便使用.但是 ...

  5. 我的Android进阶之旅------>Android使用正则表达式匹配扫描指定目录下的所有媒体文件(音乐、图像、视频文件)

    今天使用正则表达式匹配指定目录下的所有媒体文件,下面将这份代码简化了,可以收藏下来,当作工具类. package match; import java.io.File; import java.uti ...

  6. Android -- 文件扫描

    启动MediaScanner服务,扫描媒体文件,程序通过发送下面的Intent启动MediaScanner服务. 扫描指定文件 public void scanFile(Context ctx, St ...

  7. Android媒体扫描详细解析之一(MediaScanner & MediaProvider)

    用过Android手机的同学都知道,每次开机的时候系统会先扫描sdcard,sdcard重新插拔(挂载)也会扫描一次sdcard. 为什么要扫描sdcard,其实是为了给系统的其他应用提供便利,比如, ...

  8. Android 媒体存储服务(二)

    Android 媒体存储服务 简介: 本文是<深入Android媒体存储服务>系列第二篇,简要介绍媒体存储服务扫描文件的流程.文中介绍的是 Android 4.2. Android 有一套 ...

  9. Android 媒体存储服务(一)

    Android 媒体存储服务 本文介绍如何在 Android 中,开发者的 APP 如何使用媒体存储服务(包含MediaScanner.MediaProvider以及媒体信息解析等部分),包括如何把 ...

随机推荐

  1. Tools - RSS

    RSS RSS是在线共享和阅读内容的一种方式,能够简洁高效地获取订阅内容的更新. 全称Really Simple Syndication (真正简易联合),也叫聚合内容. 有选择地浏览感兴趣的以及与工 ...

  2. CentOS6.5菜鸟之旅:纯转载Linux目录结构

    来自:http://www.iteye.com/topic/1125162 使用linux也有一年多时间了  最近也是一直在维护网站系统主机  下面是linux目录结构说明 本人使用的是centos系 ...

  3. Spring基础—— 在 Spring Config 中使用外部属性文件

    一.在 Spring Config 文件中配置 Bean 时,有时候需要在 Bean 的配置里添加 系统部署的细节信息, 如文件路径,数据源配置信息.而这些部署细节实际上需要在配置文件外部来定义. 二 ...

  4. timestamp的两个属性:CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP

    timestamp有两个属性,分别是CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP两种,使用情况分别如下: 1. CURRENT_TIMESTAMP 当要 ...

  5. .Net配置文件——反射+配置文件存储类型实例

    配置文件+反射确实去除了选择语句的繁琐,带来了优美的赶脚! 首先改进了一下类(接上文): ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ...

  6. css中visiblity和display异同

    visiblity 是设置元素的可见性,即可见 / 隐藏:隐藏后元素所占有位置保留: display 是设置元素按什么样的方式来显示,是按块显示,显示成一条线的形式,显示为“消失”等等,当displa ...

  7. html+css—two

    1.滚动字幕(不常用) 默认状态:<marquee>向左移动</marquee> //-- hspasc滚动区域height滚动字幕高度 <marquee height= ...

  8. PHP框架中最喜欢的WindFramework

    题外话, 像我这样从小到大作文打0分居多的人,写文章,实在是没有耐心的,抱歉. 尽管自己也山寨过许多PHP框架,但被山寨的对象中,最喜欢的是WindFramework. Yii其实更好,但太大而全. ...

  9. 批量导数据之利器-load data[2016-07-11]

    由于天热,中午吃完饭后不再去逛了,感觉这段时间其实也是可以利用起来的,所以决定每天中午积累一些小的知识点.今天中午,先总结一下最近造数据用到手命令,load data. 使用这个命令的起源是因为最近要 ...

  10. jquery自定义插件——window的实现

    本例子实现弹窗的效果: 1.jquery.show.js /* * 开发者:lzugis * 开发时间:2014年6月10日 * 实现功能:点击在鼠标位置显示div * 版本序号:1.0 */ (fu ...