public class SongInfo {private Integer id;         //id,主键private String path;        //路径private String fileName;    //文件名  不包含路径private String artist;      //艺术家        public SongInfo(){}getXXX() setXXX()...

以扫描/mnt/sdcard上面的.mp3,.wav为例,采用 广度优先遍历


package com.mp3.scan;import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.LinkedList;import java.util.List;import java.util.Queue;import android.util.Log;import com.mp3.entity.Lyric;import com.mp3.entity.SongInfo;/*音乐文件扫描*/public class MusicScan extends Thread{private final String root = "/mnt/sdcard/";//private final String root_extra1 = "/mnt/sdcard/extra_sd";private Queue<File> directoryQueue; //遍历的文件队列private List<String> songDirList;  //歌曲目录列表private List<SongInfo> songList;  //歌曲列表private List<Lyric> lyricList;    //歌词列表private String lyricPath;private float leastSize = 200.0f;   //音乐文件最低大小 单位KBprivate boolean isCompleted = false;public MusicScan(){directoryQueue = new LinkedList<File>();songDirList = new ArrayList<String>();songList = new ArrayList<SongInfo>(); lyricList = new ArrayList<Lyric>();}/** * 广度优先遍历 * @param root 要遍历文件的根目录 * @return 返回搜索到的音乐文件信息列表 * @throws IOException  * */public List scan(String root) throws IOException{if(songList == null){songList = new ArrayList<SongInfo>();}else {songList.clear();}if(lyricList == null){lyricList = new ArrayList<Lyric>();}else {lyricList.clear();}//ReadMp3 read = new ReadMp3();  //解析歌曲文件对象 不需要解析TAG信息的话 就没必要这个对象File file=new File(root);    //根目录//file = Environment.getExternalStorageDirectory();directoryQueue.clear();      //清空队列directoryQueue.offer(file);  //入队列while(!directoryQueue.isEmpty()){file = directoryQueue.poll();  //出队列boolean isSongDir = false;    //标识变量 标识当前文件是否直接为含歌曲目录File[] fileList=file.listFiles();for (int i = 0; i < fileList.length; i++) {//System.out.println("当前文件 "+i+" 路径:" + fileList[i].getAbsolutePath());/*if(!fileList[i].exists()){System.out.println(fileList[i].getName()+" 不存在!");return null;}*/if(fileList[i].isFile()){//是文件/*if(fileList[i].length()<leastSize*1024){//小于最低大小continue;}*/if(isSong(fileList[i])){//是歌曲文件if(!isSongDir){//当前状态为 非直接含歌曲目录//避免重复添加同一目录String songDir = new String(fileList[i].getParent());songDirList.add(songDir);isSongDir = true;}if(!fileList[i].canRead()){ //////////////////这一句很重要,不然真机上面很多文件不能访问,会出现空指针情况//非可读文件continue;}//read.setFile(fileList[i]);  //设置要解析的音乐文件//SongInfo si = read.read();  //读取TAG信息
                                                
if(si == null){si = new SongInfo();Log.v("MusicScan", "音乐文件TAG信息读取失败!");}si.setFileName(fileList[i].getName());  //文件名si.setPath(fileList[i].getAbsolutePath());  //路径songList.add(si);  //添加进行歌曲列表songList}else if (isLryic(fileList[i])) {//是歌词文件System.out.println("是歌词文件" + fileList[i].getName());Lyric lyric = new Lyric(fileList[i].getPath(),fileList[i].getName());lyricList.add(lyric);}else {//非音乐文件//System.out.println(fileList[i].getName()+"不是音乐文件");}}else //fileList[i].isDirectory() == true{//是目录//System.out.println(fileList[i].getName()+"是目录");if(!fileList[i].canRead()){//非可读文件continue;}directoryQueue.offer(fileList[i]);}}}System.out.println("scan end");return songList;}

这样查找到的结果(歌曲文件、歌词文件后缀)列表分别被记录在songList,lyricList列表中

!fileList[i].canRead() 这一句很重要!否则可能出现不能遍历完所有文件!

更多相关文章

  1. 从J2EE转向Android的第七天-----文件管理
  2. 下载文件
  3. Android NDK开发之旅16--NDK--文件拆分与合并
  4. android开发中build.gradle文件详解
  5. Android在配置文件中配置Button再不同情况下的的背景
  6. Android通过SOCKET下载文件的方法
  7. 00_JNI头文件

随机推荐

  1. AndEngine添加多个动画精灵的方法
  2. 使用android自带的SwipeRefreshLayout实
  3. Beginning Android Development
  4. android GPS定位代码
  5. android studio 54 下载进度条
  6. Android翻页效果的实现原理
  7. Android适配器之---SimpleCursorAdapter
  8. Android NDK *** could not be resolved
  9. 调用Android系统设置项
  10. Android 听筒播放 适配(摩托)