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

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

public class MusicFilter implements FilenameFilter{public boolean accept(File dir , String name){return (name.endsWith(".mp3"));}
}
public void musicList(){mMusicList.clear();//先清除列表里之前的信息,mMusicList是自定义的listFile 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<listFile.length();i++){search(listFile[i], ext);//递归,直到把所有文件遍历完}}}else{//否则就是文件String fileName=file.getAbsolutePath();//返回抽象路径名的绝对路径名字符串String name=file.getName();//获得文件的名称for(int i=0;i<ext.length;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 3private String title; // 歌曲名称 0private String album; // 专辑 7private long albumId;//专辑ID 6private String displayName; //显示名称 4private String artist; // 歌手名称 2private long duration; // 歌曲时长 1private long size; // 歌曲大小 8private String url; // 歌曲路径 5private 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 List<Mp3Info> getMp3Infos(Context context){Cursor cursor=context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,MediaStore.Audio.Media.DEFAULT_SORT_ORDER);Lisr<Mp3Info> mp3Infos =new ArrayList<Mp3Infos>();for (int i=0;i<cursor.getCount();i++){cursor.moveToNext();long id=cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media._ID));long id = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media._ID)); // 音乐idString 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<HashMap<String, String>>  getMusicMaps(List<MapInfo>  mp3Infos){List<HashMap<String, String>> mp3list = new ArrayList<HashMap<String, String>>();for (Iterator iterator = mp3Infos.iterator(); iterator.hasNext();) {Mp3Info mp3Info = (Mp3Info) iterator.next();HashMap<String, String> map = new HashMap<String, String>();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() < 2) {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线程通讯,向主线程发送消息,通知更新。

Android读取Mp3音乐文件的方法相关推荐

  1. android mp3 lrc歌词文件utf-8歌词显示为乱码,Android读取本地json文件的方法(解决显示乱码问题)...

    本文实例讲述了Android读取本地json文件的方法.分享给大家供大家参考,具体如下: 1.读取本地JSON ,但是显示汉字乱码 public static String readLocalJson ...

  2. MIDI应用: 播放midi音乐文件的方法 [Win32版本+ C语言版本]

    播放midi音乐文件的方法 背景说明: 在游戏编程中,给程序增加音效几乎是必须的;在普通程序中增加音效也会给使用者带来更好的体验;而mid格式的音效文件体积最小(大约1k到数十k),效果却不亚于MP3 ...

  3. Android获取mp3音频文件播放总时长

    Android获取mp3音频文件播放总时长 一般是需要文件的绝对路径,需要读取文件,转成媒体类解析,最好获取播放时长,然后关闭资源. /** * 获取音频文件的总时长大小 * * @param fil ...

  4. python xlrd读取excel-使用Python xlrd模块读取Excel格式文件的方法

    这是一篇关于如何使用Python xlrd模块读取Excel格式文件的方法的文章,下面的python代码中使用 了xlrd模块的方法,这样就能够很方便的读取 excel 文件内容.同是这个xlrd模块 ...

  5. python读取数据库文件的扩展名_Python读取sqlite数据库文件的方法分析

    本文实例讲述了Python读取sqlite数据库文件的方法.分享给大家供大家参考,具体如下: 这是Python内置的,不需要pip install 包 数据库里面有很多张表 要操作数据库首先要连接co ...

  6. 使用Python扩展库spleeter分离MP3音乐文件中的伴奏和人声

    推荐图书: <Python程序设计(第3版)>,(ISBN:978-7-302-55083-9),董付国,清华大学出版社,2020年6月第1次印刷,2021年9月第10次印刷,山东省一流本 ...

  7. Android 读取本地txt文件中的内容

    Android 读取本地txt文件中的内容 import java.io.BufferedReader; import java.io.File; import java.io.FileInputSt ...

  8. php生成vcf,php简单读取.vcf格式文件的方法示例

    本文实例讲述了php简单读取.vcf格式文件的方法.分享给大家供大家参考,具体如下: /** * 读取.vcf格式文件 * @param $filename */ function readCvf($ ...

  9. php vcf,php读取 .vcf 格式文件的方法

    这篇文章主要介绍了php读取.vcf格式文件的方法,结合具体实例形式分析了php自定义函数读取vcf格式文件的具体实现方法与相关注意事项,需要的朋友可以参考下 具体如下: /** * 读取.vcf格式 ...

最新文章

  1. linux 编译sqlitecpp,编译安装sqlite3数据库
  2. poj 1236 Network of Schools
  3. oracle expdp导出教程,Oracle Expdp Impdp 数据泵导入导出
  4. 写给准爸爸的专业指导
  5. CSMAR database query sample
  6. 【Windows 10 应用开发】使用快捷访问键
  7. github高级搜索技巧_【建议收藏】百度 quot;隐藏quot; 的高级搜索技巧
  8. 蛇形打印数组(某宝典公司面试手撕代码题)
  9. 什么是OLAP和OLTP
  10. Eigen入门之密集矩阵 5 - 再谈Matrix初始化
  11. centos vsftp mysql_CentOS6.4 实现基于mysql的vsftpd
  12. 使用git-bash向码云提交项目
  13. Maven 用Eclipse创建web项目后报错的解决方式
  14. python define function的顺序_Python 函数声明先后顺序的问题
  15. 【通信】基于matlab FDTD法研究移动通信终端电磁辐射对人体的影响【含Matlab源码 761期】
  16. 1 使用WPE工具分析游戏网络封包
  17. MSDN2008中文版下载地址
  18. 分享一下自己开发 kindle 电子书下载助手
  19. 连续分配存储管理方式
  20. 微信新版本文件乱保存自用解决方法

热门文章

  1. 设计模式七:结构型-适配器模式
  2. 手持式DSView逻辑分析仪
  3. Python数据可视化:mplfinance创建蜡烛图(三)
  4. 基于javaweb+mysql的体育用品商城(java+SpringBoot+jsp+html+maven+mysql)
  5. 帮我用Java技术实现雪花算法
  6. 养殖虚拟仿真软件提供高沉浸式的虚拟场景互动操作体验学习
  7. Matlab:在键入时检查语法
  8. 施耐德有没有带灯急停按钮?
  9. bs4进行数据解析基础教程
  10. Cadence Orcad Capture创建原理图Symbol批量添加PIN的方法图文