Android遍历本地视频文件加过滤

最近在想写一个视频播放器玩玩,既然是播放器,肯定有播放本地视频的功能,那么问题来了,我们怎么获取本地一些视频呢?当然是遍历啦,据目前我所知道的方法有两种,一是用android里面的Cursor的contentResolver.query去获取,但是这个有一个很蛋疼的问题,就是无法识别.rmvb格式的视频(血崩…),既然我是一个追求完美的人,那么这样的情况是允许发生的,所有就有第二种方式了。

  • 异步遍历
  • 判断后缀名是否符合视频格式
  • 判断大小

编码

既然这个遍历是耗时操作,所以我们使用异步吧,避免出现ANR。这里我使用的是AsyncTask,当然也可以使用Handler或者开启线程。因为考虑到可以给用户友好的提示,所以我采用的AsyncTask。代码不是很难,这里面的VideoInfo是一个实体类,里面属性根据自己的需求去写吧,这里我就写了名字(displayName)和路径(path)两个属性。

public class ScannerAnsyTask extends AsyncTask <Void,Integer,List<VideoInfo>>{    private List videoInfos=new ArrayList();        @Override        protected List doInBackground(Void... params) {            videoInfos=getVideoFile(videoInfos, Environment.getExternalStorageDirectory());            videoInfos=filterVideo(videoInfos);            Log.i("tga","最后的大小"+videoInfos.size());            return videoInfos;        }        @Override        protected void onProgressUpdate(Integer... values) {            super.onProgressUpdate(values);        }        @Override        protected void onPostExecute(List videoInfos) {            super.onPostExecute(videoInfos);        }    /**     * 获取视频文件     * @param list     * @param file     * @return     */    private List getVideoFile(final List list, File file) {        file.listFiles(new FileFilter() {            @Override            public boolean accept(File file) {                String name = file.getName();                int i = name.indexOf('.');                if (i != -1) {                    name = name.substring(i);                    if (name.equalsIgnoreCase(".mp4")                            || name.equalsIgnoreCase(".3gp")                            || name.equalsIgnoreCase(".wmv")                            || name.equalsIgnoreCase(".ts")                            || name.equalsIgnoreCase(".rmvb")                            || name.equalsIgnoreCase(".mov")                            || name.equalsIgnoreCase(".m4v")                            || name.equalsIgnoreCase(".avi")                            || name.equalsIgnoreCase(".m3u8")                            || name.equalsIgnoreCase(".3gpp")                            || name.equalsIgnoreCase(".3gpp2")                            || name.equalsIgnoreCase(".mkv")                            || name.equalsIgnoreCase(".flv")                            || name.equalsIgnoreCase(".divx")                            || name.equalsIgnoreCase(".f4v")                            || name.equalsIgnoreCase(".rm")                            || name.equalsIgnoreCase(".asf")                            || name.equalsIgnoreCase(".ram")                            || name.equalsIgnoreCase(".mpg")                            || name.equalsIgnoreCase(".v8")                            || name.equalsIgnoreCase(".swf")                            || name.equalsIgnoreCase(".m2v")                            || name.equalsIgnoreCase(".asx")                            || name.equalsIgnoreCase(".ra")                            || name.equalsIgnoreCase(".ndivx")                            || name.equalsIgnoreCase(".xvid")) {                        VideoInfo video = new VideoInfo();                        file.getUsableSpace();                        video.setDisplayName(file.getName());                        video.setPath(file.getAbsolutePath());                        Log.i("tga","name"+video.getPath());                        list.add(video);                        return true;                    }                    //判断是不是目录                } else if (file.isDirectory()) {                    getVideoFile(list, file);                }                return false;            }        });        return list;    }    /**10M=10485760 b,小于10m的过滤掉     * 过滤视频文件     * @param videoInfos     * @return     */    private List filterVideo(List videoInfos){        List newVideos=new ArrayList();       for(VideoInfo videoInfo:videoInfos){           File f=new File(videoInfo.getPath());           if(f.exists()&&f.isFile()&&f.length()>10485760){               newVideos.add(videoInfo);               Log.i("TGA","文件大小"+f.length());           }else {               Log.i("TGA","文件太小或者不存在");           }       }        return newVideos;    }}

最后调用就是很简单的啦,

 button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                ScannerAnsyTask ansyTask=new ScannerAnsyTask();                ansyTask.execute();            }        });

最后附上最后的结果图
这里写图片描述

更多相关文章

  1. 相对布局属性详解
  2. Android视录视频示例及代码下载
  3. NDK模块开发:关于音视频,你需要了解的东西是什么?
  4. Android设备中几种YUV420p转rgb视频帧方法效率比较
  5. Android用户界面 UI组件--TextView及其子类(二) Button,selector
  6. Android实现播放本地视频
  7. 对Android基于vitamio框架调用第三方播放器播放视频的初步认识
  8. 200行Java代码实现Android下的视频通话

随机推荐

  1. Android学习札记52:广播(Broadcast)基础篇
  2. android登录模块之静态登录
  3. Activity的四种LaunchMode
  4. Android(安卓)实现歌词同步
  5. Android使用Google Breakpad进行崩溃日志
  6. Android高手进阶教程(二十五)之---Androi
  7. Android笔记:Android后台接口教程一(从零开
  8. android之NDK(jni)开发笔记1——运行第一个
  9. 阿里路由框架ARouter简介
  10. Android 2020年最新保活方案 保活90% 已