Android 指定(后缀名)格式文件扫描
16lz
2021-01-23
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() 这一句很重要!否则可能出现不能遍历完所有文件!
更多相关文章
- 从J2EE转向Android的第七天-----文件管理
- 下载文件
- Android NDK开发之旅16--NDK--文件拆分与合并
- android开发中build.gradle文件详解
- Android在配置文件中配置Button再不同情况下的的背景
- Android通过SOCKET下载文件的方法
- 00_JNI头文件