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

  具体代码:

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. Struts2的基本流程的详细介绍

    Struts2基本流程 概述: Struts2框架由三部分构成:核心控制器.业务控制器和用户实现的业务逻辑组件.在这三部分中,struts2框架提供了核心控制器StrutsPrepareAndExec ...

  2. Sql Server来龙去脉系列之四 数据库和文件

        在讨论数据库之前我们先要明白一个问题:什么是数据库?     数据库是若干对象的集合,这些对象用来控制和维护数据.一个经典的数据库实例仅仅包含少量的数据库,但用户一般也不会在一个实例上创建太多 ...

  3. ANT自动打包U3D安卓项目研究笔记

    概述 因项目使用Atlassian Stash作为项目源码管理端,且其支持Ant命令自动编译,可使其根据最新的代码自动打包,故产生该研究Ant打包的任务.在此将研究过程及一些相关知识整理记录在此. 本 ...

  4. 重新想象 Windows 8.1 Store Apps (74) - 新增控件: Flyout, MenuFlyout, SettingsFlyout

    [源码下载] 重新想象 Windows 8.1 Store Apps (74) - 新增控件: Flyout, MenuFlyout, SettingsFlyout 作者:webabcd 介绍重新想象 ...

  5. sql2008 查询字段所属表

    select a.name as 表名, g.*from sysobjects as a left join syscolumns as b on a.id=b.id left JOIN sys.ex ...

  6. EntityFramework 更新表结构到数据库

    在程序包管理器控制台 1.执行:Enable-Migrations -Force  生成:Migrations 2 修改AutomaticMigrationsEnabled默认为false改为true ...

  7. JavaMail入门第四篇 接收邮件

    上一篇JavaMail入门第三篇 发送邮件中,我们学会了如何用JavaMail API提供的Transport类发送邮件,同样,JavaMail API中也提供了一些专门的类来对邮件的接收进行相关的操 ...

  8. 树状数组--K.Bro Sorting

    题目网址: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=110064#problem/D Description Matt’s frie ...

  9. 最熟悉的陌生人-------MVC

          以前开发iOS程序的时候用的最多的是MVC的设计模式,这种软件架构的模式是由:模型(Model)[屏幕中展示的].视图(View)[如何展示的]和控制器(Controller)[程序的数据 ...

  10. winform(数据导出、TreeView的使用)

    一.数据导出:目标: 将数据库的数据导出成Excel工作表或是Word文档 基本步骤: 1.首先将数据库中的数据封装成实体类 2.写好查询数据的方法,在主窗体中调用查看所有的数据 3.利用saveFi ...