分享

Android读取Mp3音乐文件的方法

 天海544 2015-02-05

在做Mp3音乐播放器的时候,需要经常用到读取文件的操作,看过网上一些人写的读取方法,做个总结,部分代码有相似之处。

一、通过过滤器的方式过滤文件

  1. public class MusicFilter implements FilenameFilter{  
  2.     public boolean accept(File dir , String name){  
  3.         return (name.endsWith(".mp3"));  
  4.     }  
  5. }  
  1. public void musicList(){  
  2.     mMusicList.clear();//先清除列表里之前的信息,mMusicList是自定义的list  
  3.     File home=new File(MUSIC_PATH);  
  4.     if(home.listFiles(new MusicFilter()).length>0){  
  5.         for(File file :home.listFiles(new MusicFileter())){  
  6.             mMusicList.add(file.getName()); //把歌曲名字添加到mMusicList列表中  
  7.         }  
  8.     }  
  9. }  
二、通过递归,判断文件后缀名的方法

  1. public void Search(File file ,String[] ext){  
  2.     if(file!=null){  
  3.         if(file.isDirectory()){//如果是文件夹  
  4.             File[] listFile=file.listFiles();//列出所有的文件放在listFile这个File类型数组中  
  5.             if(listFile!=null){  
  6.                 for(int i=0;i
  7.                     search(listFile[i], ext);//递归,直到把所有文件遍历完  
  8.                 }  
  9.             }  
  10.         }else{//否则就是文件  
  11.             String fileName=file.getAbsolutePath();//返回抽象路径名的绝对路径名字符串  
  12.             String name=file.getName();//获得文件的名称  
  13.             for(int i=0;i
  14.                 if(fileName.endsWith(ext[i])){//判断文件后缀名是否包含我们定义的格式  
  15.                     list.add(name);  
  16.                     break;  
  17.                 }  
  18.             }  
  19.         }  
  20.     }  
  21. }  
调用的时候先声明file和String[] ext

  1. private String[] ext={".mp3", ".awv"}//定义我们要查找的文件格式  
  2. File file=Environment.getExternalStorageDirectory();//获得SD卡的路径  
  3. 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、建立一个类,定义我们的文件信息

  1. public class Mp3Info{  
  2.     private long id; // 歌曲ID 3  
  3.     private String title; // 歌曲名称 0  
  4.     private String album; // 专辑 7  
  5.     private long albumId;//专辑ID 6  
  6.     private String displayName; //显示名称 4  
  7.     private String artist; // 歌手名称 2  
  8.     private long duration; // 歌曲时长 1  
  9.     private long size; // 歌曲大小 8  
  10.     private String url; // 歌曲路径 5  
  11.     private String lrcTitle; // 歌词名称  
  12.     private String lrcSize; // 歌词大小  
  13.   
  14.     public Mp3Info(){  
  15.         super();  
  16.     }  
  17.       
  18.     public Mp3Info(long id, String title, String album, long albumId,  
  19.             String displayName, String artist, long duration, long size,  
  20.             String url, String lrcTitle, String lrcSize){  
  21.         super();  
  22.         this.id = id;  
  23.         this.title = title;  
  24.         this.album = album;  
  25.         this.albumId = albumId;  
  26.         this.displayName = displayName;  
  27.         this.artist = artist;  
  28.         this.duration = duration;  
  29.         this.size = size;  
  30.         this.url = url;  
  31.         this.lrcTitle = lrcTitle;  
  32.         this.lrcSize = lrcSize;  
  33.     }  
  34. }  

  1. public class MediaUtil{  
  2.     public static List getMp3Infos(Context context){  
  3.         Cursor cursor=context.getContentResolver().query(  
  4.             MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,  
  5.                 MediaStore.Audio.Media.DEFAULT_SORT_ORDER);  
  6.         Lisr mp3Infos =new ArrayList();  
  7.         for (int i=0;i
  8.             cursor.moveToNext();  
  9.             long id=cursor.getLong(cursor  
  10.                     .getColumnIndex(MediaStore.Audio.Media._ID));  
  11.             long id = cursor.getLong(cursor  
  12.                     .getColumnIndex(MediaStore.Audio.Media._ID)); // 音乐id  
  13.             String title = cursor.getString((cursor  
  14.                     .getColumnIndex(MediaStore.Audio.Media.TITLE))); // 音乐标题  
  15.             String artist = cursor.getString(cursor  
  16.                     .getColumnIndex(MediaStore.Audio.Media.ARTIST)); // 艺术家  
  17.             String album = cursor.getString(cursor  
  18.                     .getColumnIndex(MediaStore.Audio.Media.ALBUM)); // 专辑  
  19.             String displayName = cursor.getString(cursor  
  20.                     .getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));  
  21.             long albumId = cursor.getInt(cursor  
  22.                     .getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));  
  23.             long duration = cursor.getLong(cursor  
  24.                     .getColumnIndex(MediaStore.Audio.Media.DURATION)); // 时长  
  25.             long size = cursor.getLong(cursor  
  26.                     .getColumnIndex(MediaStore.Audio.Media.SIZE)); // 文件大小  
  27.             String url = cursor.getString(cursor  
  28.                     .getColumnIndex(MediaStore.Audio.Media.DATA)); // 文件路径  
  29.             int isMusic = cursor.getInt(cursor  
  30.                     .getColumnIndex(MediaStore.Audio.Media.IS_MUSIC)); // 是否为音乐  
  31.             if (isMusic != 0) { // 只把音乐添加到集合当中  
  32.                 mp3Info.setId(id);  
  33.                 mp3Info.setTitle(title);  
  34.                 mp3Info.setArtist(artist);  
  35.                 mp3Info.setAlbum(album);  
  36.                 mp3Info.setDisplayName(displayName);  
  37.                 mp3Info.setAlbumId(albumId);  
  38.                 mp3Info.setDuration(duration);  
  39.                 mp3Info.setSize(size);  
  40.                 mp3Info.setUrl(url);  
  41.                 mp3Infos.add(mp3Info);  
  42.         }  
  43.     }  
  44.     return mprInfos;  
  45. }  
  46. /* 
  47.     向List集合里添加Map对象,每个Map对象存放一首音乐的所有属性 
  48. */  
  49. public static List>  getMusicMaps(List  mp3Infos){  
  50.     List> mp3list = new ArrayList>();  
  51.         for (Iterator iterator = mp3Infos.iterator(); iterator.hasNext();) {  
  52.             Mp3Info mp3Info = (Mp3Info) iterator.next();  
  53.             HashMap map = new HashMap();  
  54.             map.put("title", mp3Info.getTitle());  
  55.             map.put("Artist", mp3Info.getArtist());  
  56.             map.put("album", mp3Info.getAlbum());  
  57.             map.put("displayName", mp3Info.getDisplayName());  
  58.             map.put("albumId", String.valueOf(mp3Info.getAlbumId()));  
  59.             map.put("duration", formatTime(mp3Info.getDuration()));  
  60.             map.put("size", String.valueOf(mp3Info.getSize()));  
  61.             map.put("url", mp3Info.getUrl());  
  62.             mp3list.add(map);  
  63.         }  
  64.         return mp3list;  
  65. }  
  66. /* 
  67.     格式化时间,把毫秒转换成分:秒格式 
  68. */  
  69. public static String formaTime(long time){  
  70.     String min = time / (1000 * 60) + "";  
  71.         String sec = time % (1000 * 60) + "";  
  72.         if (min.length() < 2) {  
  73.             min = "0" + time / (1000 * 60) + "";  
  74.         } else {  
  75.             min = time / (1000 * 60) + "";  
  76.         }  
  77.         if (sec.length() == 4) {  
  78.             sec = "0" + (time % (1000 * 60)) + "";  
  79.         } else if (sec.length() == 3) {  
  80.             sec = "00" + (time % (1000 * 60)) + "";  
  81.         } else if (sec.length() == 2) {  
  82.             sec = "000" + (time % (1000 * 60)) + "";  
  83.         } else if (sec.length() == 1) {  
  84.             sec = "0000" + (time % (1000 * 60)) + "";  
  85.         }  
  86.         return min + ":" + sec.trim().substring(0, 2);  
  87.     }  
  88. }  

在实际的开发中,调用以上各种方法的时候,请记得开辟新的线程,读取SD卡,查询数据库,网络下载等操作都是需要在新的线程中进行,然后使用Handler线程通讯,向主线程发送消息,通知更新。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多