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));
        }
    }
}

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

时间: 2024-12-15 15:57:46

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

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

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

Android媒体解码MediaCodec MediaExtractor学习

Android提供了MediaPlayer播放器播放媒体文件,其实MediaPlyer只是对Android Media包下的MediaCodec和MediaExtractor进行了包装,方便使用.但是最好理解下Android媒体文件的解码,编码和渲染流程. 使用android.media包下的MediaCodec和MediaExtractor实现一个简单的视频解码渲染. 使用到了: MediaCodec:负责媒体文件的编码和解码工作,内部方法均为native方法 MediaExtractor:负

Android -- 文件扫描

启动MediaScanner服务,扫描媒体文件,程序通过发送下面的Intent启动MediaScanner服务. 扫描指定文件 public void scanFile(Context ctx, String filePath) { Intent scanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); scanIntent.setData(Uri.fromFile(new File(filePath))); ctx.send

android 保存文件的各种目录列表

一般的,我们可以通过context和Environment来获取要保存文件的目录 ($rootDir) +- /data -> Environment.getDataDirectory() | | | | ($appDataDir) | +- data/com.srain.cube.sample | | | | ($filesDir) | +- files -> Context.getFilesDir() / Context.getFileStreamPath("") |

Android 媒体存储服务(一)

Android 媒体存储服务 本文介绍如何在 Android 中,开发者的 APP 如何使用媒体存储服务(包含MediaScanner.MediaProvider以及媒体信息解析等部分),包括如何把 APP 新增或修改的文件更新到媒体数据库.如何在多媒体应用中隐藏 APP 产生的文件.如何监听媒体数据库的变化等等. 简介:本文介绍如何在 Android 中,开发者的 APP 如何使用媒体存储服务(包含MediaScanner.MediaProvider以及媒体信息解析等部分),包括如何把 APP

完美解决Android使用Zxing扫描二维码改成竖屏后,后面的预览画面出现了拉伸,扭曲的情况

完美解决解决Android使用Zxing扫描二维码改成竖屏后,后面的预览画面出现了拉伸,扭曲的情况 第一步:找到com.zxing.camera包下的CameraConfigurationManager.java文件中的void initFromCameraParameters(Camera camera)方法 第二步:在 Log.d(TAG, "Screen resolution: " + screenResolution);后加上如下的代码 Point screenResoluti

Android 使用ContentProvider扫描手机中的图片,仿微信显示本地图片效果

首先我们先看第一个界面吧,使用将手机中的图片扫描出来,然后根据图片的所在的文件夹将其分类出来,并显示所在文件夹里面的一张图片和文件夹中图片个数,我们根据界面元素(文件夹名, 文件夹图片个数,文件夹中的一张图片)使用一个实体对象ImageBean来封装这三个属性 package com.example.imagescan; /** * GridView的每个item的数据对象 * * @author len * */ public class ImageBean{ /** * 文件夹的第一张图片路

如何Android中加入扫描名片功能

要想实现android手机通过扫描名片,得到名片信息,可以使用脉可寻提供的第三方SDK,即Maketion ScanCard SDK,脉可寻云名片识别服务.他们的官方网站为http://www.maketion.com/. 一.概述 Maketion ScanCardSDK(以下简称SDK)是提供给第三方合作伙伴接入脉可寻云名片识别服务,合作伙伴需要先申请key和secure才可以使用. SDK不能独立运行,使用时需要嵌入到Android的Project中. SDK支持Android2.1版本及

NET媒体文件操作组件TagLib

开源的.NET媒体文件操作组件TagLib#解析 人生得意须尽欢 莫使金樽空对月.写博客都会在吃饭后,每次吃饭都要喝上二两小酒,写博客前都要闲扯,这些都是个人爱好,改不掉了,看不惯的人,还望多多包含一下,有相同爱好的同学,咱们可以一起喝着小酒一边吹牛逼.总有人跟我说要做正事,但是这个世界什么叫做正事什么叫做闲事呢?见解各不相同吧,我自己喜欢的在我的世界就是正事. 万事急不得,需要等待时机和足够的积累方可一举成事. 接着前面的组件进行一个简单的介绍,在写博文之前,自己都会做一个简单的了解和应用,毕