Github地址:https://github.com/boybeak/BeMusic

请移步到新文章查看新的教程

以前写过很多次音乐播放器,但是总有一些问题出现,例如:

1,音乐长时间播放问题(即便是放在service中去播放,依然会被杀死);

2,音乐的播放进度如何掌握?(如何利用mediaplayer.getCurrentPosition()来有效的通知界面变更进度?);

3,在我以往的经验中,音乐播放完毕下一曲时候,经常出现当前音乐播放还差几秒钟的时候就下一曲了的情况。

从网上找到教程中,通常都是一个播放器的demo,简单的直接把MediaPlayer放在了一个Activity中去操作,稍有良心的教程把MediaPlayer放在了Servic中,但是这是远远不够的。

最好的教程还是谷歌官方的Training和API Guides,尽管很久以前就简单粗暴的读过有关service的文档,但是,古人都说温故而知新嘛,经过这次温故,对比以前的代码经验,觉得可以有更好的方式来实现一个音乐播放器。遂决定重新写一个音乐播放器。

如果有大神有更好 方案,还望知会我。

注意:这篇文章,不适合对MediaPlayer不了解的同学,假定看这篇文章的,都是已经会初步使用Service的同学。

一,音乐列表的读取。

关于音乐列表的读取,不同的音乐播放器都会有不同的方案,有的是有多重方案并用。例如说,全盘扫描音乐格式文件等,但是Android本身有媒体库,可以读取本地媒体库的数据,来快速获知设备上的音乐。

首先我封装了一个Audio类来存储读取的音频信息。

public class Audio {private String mTitle,mTitleKey,mArtist,mArtistKey,mComposer,mAlbum,mAlbumKey,mDisplayName,mMimeType,mPath;private int mId,mArtistId,mAlbumId,mYear,mTrack;private int mDuration = 0,mSize = 0;private boolean isRingtone = false,isPodcast = false,isAlarm = false,isMusic = false,isNotification = false;public Audio (Bundle bundle) {mId = bundle.getInt(MediaStore.Audio.Media._ID);mTitle = bundle.getString(MediaStore.Audio.Media.TITLE);mTitleKey = bundle.getString(MediaStore.Audio.Media.TITLE_KEY);mArtist = bundle.getString(MediaStore.Audio.Media.ARTIST);mArtistKey = bundle.getString(MediaStore.Audio.Media.ARTIST_KEY);mComposer = bundle.getString(MediaStore.Audio.Media.COMPOSER);mAlbum = bundle.getString(MediaStore.Audio.Media.ALBUM);mAlbumKey = bundle.getString(MediaStore.Audio.Media.ALBUM_KEY);mDisplayName = bundle.getString(MediaStore.Audio.Media.DISPLAY_NAME);mYear = bundle.getInt(MediaStore.Audio.Media.YEAR);mMimeType = bundle.getString(MediaStore.Audio.Media.MIME_TYPE);mPath = bundle.getString(MediaStore.Audio.Media.DATA);mArtistId = bundle.getInt(MediaStore.Audio.Media.ARTIST_ID);mAlbumId = bundle.getInt(MediaStore.Audio.Media.ALBUM_ID);mTrack = bundle.getInt(MediaStore.Audio.Media.TRACK);mDuration = bundle.getInt(MediaStore.Audio.Media.DURATION);mSize = bundle.getInt(MediaStore.Audio.Media.SIZE);isRingtone = bundle.getInt(MediaStore.Audio.Media.IS_RINGTONE) == 1;isPodcast = bundle.getInt(MediaStore.Audio.Media.IS_PODCAST) == 1;isAlarm = bundle.getInt(MediaStore.Audio.Media.IS_ALARM) == 1;isMusic = bundle.getInt(MediaStore.Audio.Media.IS_MUSIC) == 1;isNotification = bundle.getInt(MediaStore.Audio.Media.IS_NOTIFICATION) == 1;}public int getId() {return mId;}public String getMimeType () {return mMimeType;}public int getDuration () {return mDuration;}public int getSize () {return mSize;}public boolean isRingtone () {return isRingtone;}public boolean isPodcast () {return isPodcast;}public boolean isAlarm () {return isAlarm;}public boolean isMusic () {return isMusic;}public boolean isNotification () {return isNotification;}public String getTitle () {return mTitle;}public String getTitleKey () {return mTitleKey;}public String getArtist () {return mArtist;}public int getArtistId () {return mArtistId;}public String getArtistKey () {return mArtistKey;}public String getComposer () {return mComposer;}public String getAlbum () {return mAlbum;}public int getAlbumId () {return mAlbumId;}public String getAlbumKey () {return mAlbumKey;}public String getDisplayName () {return mDisplayName;}public int getYear () {return mYear;}public int getTrack () {return mTrack;}public String getPath () {return mPath;}}

以上类来封装音乐媒体信息,一些变量看名字也能看出来是什么,例如说title,duration此类,无非就是歌曲名称,时长之类的信息,有些变量名字单词认识,但是并不知道干什么用,其实我也不知道是什么信息,虽然打印出来过,但是并不懂到底哪里能用到,反正一股脑都读出来了先,以后再打印输出看看都是些什么。

其次,一个读取媒体音频的方法:

public class MediaUtils {public static final String[] AUDIO_KEYS = new String[]{MediaStore.Audio.Media._ID,MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media.TITLE_KEY,MediaStore.Audio.Media.ARTIST,MediaStore.Audio.Media.ARTIST_ID,MediaStore.Audio.Media.ARTIST_KEY,MediaStore.Audio.Media.COMPOSER,MediaStore.Audio.Media.ALBUM,MediaStore.Audio.Media.ALBUM_ID,MediaStore.Audio.Media.ALBUM_KEY,MediaStore.Audio.Media.DISPLAY_NAME,MediaStore.Audio.Media.DURATION,MediaStore.Audio.Media.SIZE,MediaStore.Audio.Media.YEAR,MediaStore.Audio.Media.TRACK,MediaStore.Audio.Media.IS_RINGTONE,MediaStore.Audio.Media.IS_PODCAST,MediaStore.Audio.Media.IS_ALARM,MediaStore.Audio.Media.IS_MUSIC,MediaStore.Audio.Media.IS_NOTIFICATION,MediaStore.Audio.Media.MIME_TYPE,MediaStore.Audio.Media.DATA};public static List<Audio> getAudioList(Context context) {List<Audio> audioList = new ArrayList<Audio>();ContentResolver resolver = context.getContentResolver();Cursor cursor = resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,AUDIO_KEYS,null,null,null);for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {Bundle bundle = new Bundle ();for (int i = 0; i < AUDIO_KEYS.length; i++) {final String key = AUDIO_KEYS[i];final int columnIndex = cursor.getColumnIndex(key);final int type = cursor.getType(columnIndex);switch (type) {case Cursor.FIELD_TYPE_BLOB:break;case Cursor.FIELD_TYPE_FLOAT:float floatValue = cursor.getFloat(columnIndex);bundle.putFloat(key, floatValue);break;case Cursor.FIELD_TYPE_INTEGER:int intValue = cursor.getInt(columnIndex);bundle.putInt(key, intValue);break;case Cursor.FIELD_TYPE_NULL:break;case Cursor.FIELD_TYPE_STRING:String strValue = cursor.getString(columnIndex);bundle.putString(key, strValue);break;}}Audio audio = new Audio (bundle);audioList.add(audio);}cursor.close();return audioList;}
}

如此返回一个Audio的List,现在我们可以用这个List做一个列表展示。

如何写一个正经的Android音乐播放器 一相关推荐

  1. 用jquery写一个属于自己的音乐播放器

    看到一个用css3实现的CD的动画,演示在这儿http://codepen.io/_kieran/pen/QNRmep 突然那我就想说给自己做一个音乐播放器吧,说做就做.演示在https://echo ...

  2. 一个简单的Android音乐播放器

    在这里主要是用两个简单的按钮实现音乐的播放和停止功能,工程的目录结构为: 同时添加一个文件夹,里面放后缀为mp3的文件就可以了. 在main配置文件主要是添加两个Button: 添加一个activit ...

  3. 项目: 用C语言写一个图形化的音乐播放器 【C++ / C】

    目录 最终效果 代码 资源地址 最终效果 代码 /************ 1开头的是周杰伦的歌 2开头的是林俊杰的歌 3开头的是许嵩的歌 *************/ #include<std ...

  4. 用python写的一个简易的云音乐播放器

    本人最近在学习python,在看了一些教程后,用python写了一个简单的云音乐播放器,下面把主要代码贴上来,其中用到了github上他人写的一个汉字转拼音的库,大家可以在github上找到. #co ...

  5. android音乐播放器完整教程,android实现简单音乐播放器

    本文实例为大家分享了android音乐播放器的具体代码,供大家参考,具体内容如下 话不多说先上效果 前言 写这个音乐播放器实在是迫不得已.因为我们Andoird课程要求写一个音乐播放器.所以就有了此项 ...

  6. 基于android音乐播放器的设计

    本科毕业论文(设计)诚信声明 本人郑重声明:所呈交的毕业论文(设计),题目<---基于android音乐播放器的设计----------->是本人在指导教师的指导下,进行研究工作所取得的成 ...

  7. Android音乐播放器开发(2)—登录

    1. 说明 本音乐播放器基于Android开发,原为我和另外两个小伙伴在上学期间一起做的一个小项目,近来有时间整理一下.之前我有文章已经介绍了播放界面的功能实现(Android音乐播放器开发),但介绍 ...

  8. Android音乐播放器开发(3)—注册

    1. 说明 本音乐播放器基于Android开发,原为我和另外两个小伙伴在上学期间一起做的一个小项目,近来有时间整理一下.之前我有文章已经介绍了播放界面的功能实现(Android音乐播放器开发),但介绍 ...

  9. Android音乐播放器开发(4)—修改密码

    1. 说明 本音乐播放器基于Android开发,原为我和另外两个小伙伴在上学期间一起做的一个小项目,近来有时间整理一下.之前我有文章已经介绍了播放界面的功能实现(Android音乐播放器开发),但介绍 ...

最新文章

  1. C++ kadane算法的实现之二(附完整源码)
  2. Linux操作系统下Sudo命令的使用方法说明
  3. EhCache复制:RMI与JGroups
  4. WordPress /wp-admin/includes/post.php user_ID 参数操作权限提升漏洞
  5. signal函数说明
  6. 静态页面实现include
  7. 地址栏参数获取函数 GetQueryStr(name)
  8. WebService学习总结(3)——使用java JDK开发WebService
  9. Node.js介绍及安装
  10. 浏览器最小显示12px字体的解决方法
  11. 西门子S7-1200PLC脉冲控制伺服程序案例 此程序是关于西门子1200PLC以PTO脉冲方式控制伺服电机,步进电机的功能块程序
  12. 十次方:区块链需要服务器吗?
  13. 【宝藏系列】如何解决word选中文字按backspace无法删除的问题
  14. latex文字加粗、斜体
  15. NVIDIA VIDEO ENCODER(NVENC)7.0.1 SDK 编码流程 学习笔记
  16. 每天学一点设计模式-工厂方法模式
  17. 如何求1^k+2^k+...+n^k
  18. C语言字符类型输入方式选择
  19. C语言中的带参宏和带参函数的区别
  20. SSM出租车查询系统毕业设计-附源码220915

热门文章

  1. 大学生申请软著(新系统!)注意事项!亲身经历!
  2. 产品经理们如何看待NPDP认证?你知道吗?
  3. 04.Linux-CentOS系统SSH连接问题
  4. 今天聊聊数据湖和“三剑客”,吐槽一下数据湖被夸大的增量功能
  5. 优图、音视频实验室之后,腾讯SNG量子实验室也浮出水面
  6. proxy代理配置 goproxy 代理配置
  7. 万能试验机设计(说明书+CAD图纸+外文翻译+开题报告)
  8. 小程序实战:微信小程序开发基础(胎儿体重测算工具实例)
  9. 预警级别的威胁情报(一)
  10. 微信浏览器 、qq浏览器(video) 的特殊之处