java awv音频播放界面_Android读取Mp3音乐文件的方法

本文总结了在Android中读取MP3和AWV音乐文件的三种方法:通过过滤器筛选MP3文件、递归判断文件后缀以及使用MediaStore查询音频信息。详细介绍了如何获取歌曲的元数据,如标题、艺术家、专辑和时长,并提供了代码示例。在实际应用中,这些操作应在后台线程中执行,以确保UI的流畅性。
摘要由CSDN通过智能技术生成

在做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线程通讯,向主线程发送消息,通知更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值