在做Mp3音乐播放器的时候,需要经常用到读取文件的操作,看过网上一些人写的读取方法,做个总结,部分代码有相似之处。
一、通过过滤器的方式过滤文件
public class MusicFilter implements FilenameFilter{
public boolean accept(File dir , String name){
return (name.endsWith(".mp3"));
}
}
public void musicList(){
mMusicList.clear();//先清除列表里之前的信息,mMusicList是自定义的list
File home=new File(MUSIC_PATH);
if(home.listFiles(new MusicFilter()).length>0){
for(File file :home.listFiles(new MusicFileter())){
mMusicList.add(file.getName()); //把歌曲名字添加到mMusicList列表中
}
}
}二、通过递归,判断文件后缀名的方法
public void Search(File file ,String[] ext){
if(file!=null){
if(file.isDirectory()){//如果是文件夹
File[] listFile=file.listFiles();//列出所有的文件放在listFile这个File类型数组中
if(listFile!=null){
for(int i=0;i
search(listFile[i], ext);//递归,直到把所有文件遍历完
}
}
}else{//否则就是文件
String fileName=file.getAbsolutePath();//返回抽象路径名的绝对路径名字符串
String name=file.getName();//获得文件的名称
for(int i=0;i
if(fileName.endsWith(ext[i])){//判断文件后缀名是否包含我们定义的格式
list.add(name);
break;
}
}
}
}
}调用的时候先声明file和String[] ext
private String[] ext={".mp3", ".awv"}//定义我们要查找的文件格式
File file=Environment.getExternalStorageDirectory();//获得SD卡的路径
search(file ,ext);
三、通过MediaStore的方式查询数据库得到歌曲信息
MediaStore这个类是Android系统提供的而一个多媒体数据库,android中多媒体信息都可以从这里提取,包括了多媒体数据库的所有信息,例如音频、视频和图像,android把所有的多媒体数据接口进行了封装,所有的数据库不用自己进行创建,直接调用ContentResolver去调用那些已经封装好的接口就可以进行数据库操作了,操作视频和图像的方法和操作音频类似,只需要将URL部分改动就可以了。
首先,要得到一个ContentResolver实例,利用Activity或者Service中的Context也可以
ContentResolvermResolver =Context.getContentReslover;
Cursor cursor =mResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URL,null,null,null,MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
//介绍下query方法query(uri,prjs,selections,selectArgs,order);
Uri :这个Uri代表要查询单额数据库名称加上表的名称,一般直接从MediaStroe里获取的信息,例如我们要取得所有的歌曲信息,就必须利用MediaStore.Audio.Media.EXTERNAL_CONTENT_RUI这个Uri。专辑信息要利用MediaStore.Audio.Albums.EXTERNA_CONTENT_URI这个Uri来查询,其他的也类似。
Prjs:代表要从表中选择的列,用一个StringS数组来表示。
Selections:相当于SQL语句中的where子句,就是代表你的查询条件。
selectArgs:这个参数是说你的Selections里有?这个符号是,这里可以以实际值代替这个问号。如果Selections这个没有?的话,那么这个String数组可以为null。
Order:说明查询结果按什么来排序。
1、建立一个类,定义我们的文件信息
public class Mp3Info{
private long id; // 歌曲ID 3
private String title; // 歌曲名称 0
private String album; // 专辑 7
private long albumId;//专辑ID 6
private String displayName; //显示名称 4
private String artist; // 歌手名称 2
private long duration; // 歌曲时长 1
private long size; // 歌曲大小 8
private String url; // 歌曲路径 5
private String lrcTitle; // 歌词名称
private String lrcSize; // 歌词大小
public Mp3Info(){
super();
}
public Mp3Info(long id, String title, String album, long albumId,
String displayName, String artist, long duration, long size,
String url, String lrcTitle, String lrcSize){
super();
this.id = id;
this.title = title;
this.album = album;
this.albumId = albumId;
this.displayName = displayName;
this.artist = artist;
this.duration = duration;
this.size = size;
this.url = url;
this.lrcTitle = lrcTitle;
this.lrcSize = lrcSize;
}
}
public class MediaUtil{
public static ListgetMp3Infos(Context context){
Cursor cursor=context.getContentResolver().query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,
MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
Lisrmp3Infos =new ArrayList();
for (int i=0;i
cursor.moveToNext();
long id=cursor.getLong(cursor
.getColumnIndex(MediaStore.Audio.Media._ID));
long id = cursor.getLong(cursor
.getColumnIndex(MediaStore.Audio.Media._ID)); // 音乐id
String title = cursor.getString((cursor
.getColumnIndex(MediaStore.Audio.Media.TITLE))); // 音乐标题
String artist = cursor.getString(cursor
.getColumnIndex(MediaStore.Audio.Media.ARTIST)); // 艺术家
String album = cursor.getString(cursor
.getColumnIndex(MediaStore.Audio.Media.ALBUM)); // 专辑
String displayName = cursor.getString(cursor
.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));
long albumId = cursor.getInt(cursor
.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));
long duration = cursor.getLong(cursor
.getColumnIndex(MediaStore.Audio.Media.DURATION)); // 时长
long size = cursor.getLong(cursor
.getColumnIndex(MediaStore.Audio.Media.SIZE)); // 文件大小
String url = cursor.getString(cursor
.getColumnIndex(MediaStore.Audio.Media.DATA)); // 文件路径
int isMusic = cursor.getInt(cursor
.getColumnIndex(MediaStore.Audio.Media.IS_MUSIC)); // 是否为音乐
if (isMusic != 0) { // 只把音乐添加到集合当中
mp3Info.setId(id);
mp3Info.setTitle(title);
mp3Info.setArtist(artist);
mp3Info.setAlbum(album);
mp3Info.setDisplayName(displayName);
mp3Info.setAlbumId(albumId);
mp3Info.setDuration(duration);
mp3Info.setSize(size);
mp3Info.setUrl(url);
mp3Infos.add(mp3Info);
}
}
return mprInfos;
}
/*
向List集合里添加Map对象,每个Map对象存放一首音乐的所有属性
*/
public static List> getMusicMaps(Listmp3Infos){
List> mp3list = new ArrayList>();
for (Iterator iterator = mp3Infos.iterator(); iterator.hasNext();) {
Mp3Info mp3Info = (Mp3Info) iterator.next();
HashMapmap = new HashMap();
map.put("title", mp3Info.getTitle());
map.put("Artist", mp3Info.getArtist());
map.put("album", mp3Info.getAlbum());
map.put("displayName", mp3Info.getDisplayName());
map.put("albumId", String.valueOf(mp3Info.getAlbumId()));
map.put("duration", formatTime(mp3Info.getDuration()));
map.put("size", String.valueOf(mp3Info.getSize()));
map.put("url", mp3Info.getUrl());
mp3list.add(map);
}
return mp3list;
}
/*
格式化时间,把毫秒转换成分:秒格式
*/
public static String formaTime(long time){
String min = time / (1000 * 60) + "";
String sec = time % (1000 * 60) + "";
if (min.length()
min = "0" + time / (1000 * 60) + "";
} else {
min = time / (1000 * 60) + "";
}
if (sec.length() == 4) {
sec = "0" + (time % (1000 * 60)) + "";
} else if (sec.length() == 3) {
sec = "00" + (time % (1000 * 60)) + "";
} else if (sec.length() == 2) {
sec = "000" + (time % (1000 * 60)) + "";
} else if (sec.length() == 1) {
sec = "0000" + (time % (1000 * 60)) + "";
}
return min + ":" + sec.trim().substring(0, 2);
}
}
在实际的开发中,调用以上各种方法的时候,请记得开辟新的线程,读取SD卡,查询数据库,网络下载等操作都是需要在新的线程中进行,然后使用Handler线程通讯,向主线程发送消息,通知更新。