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

  具体代码:

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. python编码问题的最终分析

    python初学者,往往因为字符编码的问题而苦恼不已,本人也是阅读了大量的博客,再进行了一定的测试,基本搞清楚了编码问题的前因后果.下面一段代码是在python3.5上的,以它为例进行讲解(请忽略糟糕 ...

  2. Angular系列----AngularJS入门教程02:静态模板(转载)

    为了说明angularJS如何增强了标准HTML,我们先将创建一个静态HTML页面模板,然后把这个静态HTML页面模板转换成能动态显示的AngularJS模板. 在本步骤中,我们往HTML页面中添加两 ...

  3. [SQL] Oracle基础语法

    1.安装: oracle11g server 这里的口令为sys和system的密码.(10版本以前默认用户会有系统默认密码.) Oracle 11g 默认用户名和密码 oracle11g clien ...

  4. sprint3(第十天)

    因为近期准备四六级考试还有准备期末的作业,任务比较多,所以进度落下了很多,没有完成预期的计划. 燃尽图

  5. dp --- Codeforces 245H :Queries for Number of Palindromes

    Queries for Number of Palindromes Problem's Link:   http://codeforces.com/problemset/problem/245/H M ...

  6. 面向对象的Javascript(5):继承

    在小项目中对于JavaScript使用,只要写几个function就行了.但在大型项目中,尤其是在开发追求 良好的用户体验的网站中,如SNS,就会 用到大量的JavaScrpt,有时JavaScrip ...

  7. 解决打印机报错:操作无法完成(错误0x00000709)。

    解决:操作无法完成(错误0x00000709).再次检查打印机名称,并确保打印机已连接到... 上午同时说,网络打印机打印不了,于是首先看一下打印服务器IP是不是给换了,结果没换. 接着尝试重新添加一 ...

  8. 南昌PHP程序员的工资水平据说可达到8000了

    有兄弟说南昌PHP程序工资水平可以达到8k,带团队可以达到10k 好消息啊!

  9. PHP学习笔记:伪静态规则的书写

    这里以阿帕奇为服务器软件,直接上案例: 1.把index.html重定向到index.php RewriteEngine On Options -Indexes ReWriteRule ^index. ...

  10. jQuery中each()、find()、filter()等节点操作方法

    1.each(callback) 官方解释: 返回值:jQuery 概述 以每一个匹配的元素作为上下文来执行一个函数. 意味着,每次执行传递进来的函数时,函数中的this关键字都指向一个不同的DOM元 ...