android媒体文件扫描
项目中可能有这样的需求:下载或导入、导出的图片、音乐等媒体文件,需要马上能在图库或本地视屏播放器中显示出来,或者要能在媒体数据库中查询到媒体文件的相关信息,这时我们就得主动通知系统扫描新的媒体文件了。我整理了一个扫描的工具类,分享下。
具体代码:
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媒体文件扫描的更多相关文章
- Android调用MediaScanner进行新产生的媒体文件扫描
有时候,我们拍了一张图片或录制了一段视频,图库应用默认没有将这些新产生的文件识别出来所以打开图库或视频播放器发现没有找到这些文件,需要调用MediaScanner扫描一下才会出来.从FFMPEG中找了 ...
- 深入Android媒体存储服务(二):磁盘扫描流程
简介: 本文是<深入Android媒体存储服务>系列第二篇,简要介绍媒体存储服务扫描文件的流程.文中介绍的是 Android 4.2. Android 有一套媒体存储服务,进程名是 and ...
- Android媒体解码MediaCodec MediaExtractor学习
Android提供了MediaPlayer播放器播放媒体文件,其实MediaPlyer只是对Android Media包下的MediaCodec和MediaExtractor进行了包装,方便使用.但是 ...
- Android媒体解码MediaCodec,MediaExtractor
Android提供了MediaPlayer播放器播放媒体文件,其实MediaPlyer只是对Android Media包下的MediaCodec和MediaExtractor进行了包装,方便使用.但是 ...
- 我的Android进阶之旅------>Android使用正则表达式匹配扫描指定目录下的所有媒体文件(音乐、图像、视频文件)
今天使用正则表达式匹配指定目录下的所有媒体文件,下面将这份代码简化了,可以收藏下来,当作工具类. package match; import java.io.File; import java.uti ...
- Android -- 文件扫描
启动MediaScanner服务,扫描媒体文件,程序通过发送下面的Intent启动MediaScanner服务. 扫描指定文件 public void scanFile(Context ctx, St ...
- Android媒体扫描详细解析之一(MediaScanner & MediaProvider)
用过Android手机的同学都知道,每次开机的时候系统会先扫描sdcard,sdcard重新插拔(挂载)也会扫描一次sdcard. 为什么要扫描sdcard,其实是为了给系统的其他应用提供便利,比如, ...
- Android 媒体存储服务(二)
Android 媒体存储服务 简介: 本文是<深入Android媒体存储服务>系列第二篇,简要介绍媒体存储服务扫描文件的流程.文中介绍的是 Android 4.2. Android 有一套 ...
- Android 媒体存储服务(一)
Android 媒体存储服务 本文介绍如何在 Android 中,开发者的 APP 如何使用媒体存储服务(包含MediaScanner.MediaProvider以及媒体信息解析等部分),包括如何把 ...
随机推荐
- Xcode_cocoaPods-超详细傻瓜式安装教程
一.Ruby环境: 下载cocoaPods需要Ruby环境. 1. Mac os 10.5以后只带Ruby环境.为了确保万无一失还是查看一下吧. 打开终端 (1)ruby -v (2)更新tuby g ...
- 使用WinDbg调试SQL Server查询
上一篇文章我给你介绍了WinDbg的入门,还有你如何能附加到SQL Server.今天的文章,我们继续往前一步,我会向你展示使用WinDbg调试SQL Server查询需要的步骤.听起来很有意思?我们 ...
- css3照片墙+曲线阴影
css3照片墙+曲线阴影 最近在学习jquery,晚上想复习下以前学过的知识,看到网上有关于css3照片墙的,感觉挺好玩的,就做了做.(以下图片均来自网络) 一.css3照片墙 html部分: < ...
- mysql depended_query 优化案例一则
月度利息统计sql优化 原因:写的sql语句复杂,理解起来有难度,另一方面,查询性能比较低 原来的语句如下: SELECT tp.year, tp.month, tp.bid_id, b.`title ...
- Web 前端颜色值--字体--使用,整理整理
做网页时经常挑选不好颜色吧...多看看颜色值,或者自己配吧.... 颜色值 CSS 颜色使用组合了红绿蓝颜色值 (RGB) 的十六进制 (hex) 表示法进行定义.对光源进行设置的最低值可以是 0(十 ...
- Fisrt Node-Webkit App
1.什么是Node-Webkit 基于node.js和chromium的应用程序实时运行环境,可运行通过HTML(5).CSS(3).Javascript来编写的本地应用程序.node.js和webk ...
- JavaScrip的DOM操作
1.DOM的基本概念 DOM是文档对象模型,这种模型为树模型,文档是指标签文档:对象是指文档中每个元素:模型是指抽象化的东西 2.Windows对象操作 一.属性和方法 二.Window.open(& ...
- div与>div区别小结
两者之间的区别:例如div span得到的是div下所有的span元素,而div>span则是取得的div下第一级的span元素. 示例代码如下: <!DOCTYPE html> & ...
- MSIL指令集
名称 说明 Add 将两个值相加并将结果推送到计算堆栈上. Add.Ovf 将两个整数相加,执行溢出检查,并且将结果推送到计算堆栈上. Add.Ovf.Un 将两个无符号整数值相加,执行溢出检查,并且 ...
- 重新想象 Windows 8.1 Store Apps (83) - 文件系统的新特性
[源码下载] 重新想象 Windows 8.1 Store Apps (83) - 文件系统的新特性 作者:webabcd 介绍重新想象 Windows 8.1 Store Apps 之文件系统的新特 ...