音乐播放器 第7节 播放音乐

第7节 播放音乐

音乐播放列表也准备好了,我们来播放音乐吧。完成后效果如下,

实现音乐的播放,我们需要播放界面和音乐服务两个方面的合作。

7.1 MusicService

前面我们已经为播放音乐的功能在MusicService中搭建好了框架,下面就要来实现它们了。这些实现接口的函数,我们在命名的时候都用上了xxxInner()这样的格式,例如playInner(),这是功能真正实现的地方。

7.1.1 创建播放器

MediaPlayer是实现音乐播放的核心,所有与播放相关的操作都是通过它来完成的。当MusicService运行起来的时候,就需要创建它的实例,退出时,要释放MediaPlayer实例,

7.1.2 监听器

MusicService提供注册监听器的接口,当播放音乐的状态发生变化的时候,能够实时的将当前的状态传递给关心的组件。

监听器的接口在之前的章节中,我们已经定义成了,

当某个组件(例如MusicListActivity)想要监听MusicServcie的时候,就要利用registerOnStateChangeListener()unregisterOnStateChangeListener()进行注册。MusicService把注册的监听器存储到数组列表当中,需要的时候取出来使用,

7.1.3 控制播放

播放、暂停、播放前一首、播放后一首的功能实现,并通过监听器通知监听者MusicService的状态变化。当前要播放的歌曲,将被放在叫做mCurrentMusicItemMusicItem数据结构中,

7.1.4 通知播放进度

除了控制播放,还要能向监听者报告当前音乐的播放进度。

我们设计的策略是:当音乐开始播放的时候,就每隔一秒钟报告一次当前播放的进度。要实现每隔一秒报告一次,可以通过创建Handler,每间隔一秒发送一条通知的消息来实现。

当音乐开始播放的时候,触发进度更新;当音乐暂停或者停止的时候,停止进度的更新;

7.1.5 连续播放

我们设计的播放规则是-将播放列表里的音乐按照次序自动播放,直到播完。所以我们要在每一首音乐结束后,自动播放下一首音乐。为此,要给播放器注册一个播放是否完成的监听器,当监听器被触发,开始下一首音乐的播放,

7.1.6 初始化待播音乐

MusicService启动之后,要先读取数据库中存储的播放列表,把第一首音乐作为默认的待播放的音乐,

7.1.7 添加到播放列表

关于我们定制的规则是这样的:如果用户选择添加一首音乐,那么添加后,自动播放该首音乐;如果用户选择添加一组音乐,那么添加后,自动播放该组音乐列表中的第一首。所以添加播放列表的代码还要做一些修改,

7.2 播放界面

根据我们的设计,播放界面位于音乐列表的下方。这里面将包含播放、暂停、上一首、下一首、播放进度展示、播放进度拖动等功能。

7.2.1 界面修改

为了实现各种控制功能,我们需要修改界面布局方式,将这个区域叫做播放控制区域。界面布局如下,

7.2.2 控制区域组件

MusicListActivity创建的时候,我们将获取播放器控制区域的组件,并添加对按钮进度条的响应,

7.2.3 禁用和启动控制区域

当音乐列表进入modal状态或者播放列表为空时,要让控制区域不可操作,

7.2.4 注册监听器

更新播放状态,在取得MusicService的访问接口后,注册监听器,更新控制区域的信息,

7.2.5 实现监听器

实现监听器监听MusicService的变化,


至此,整个应用的音乐播放功能就完整的实现了。下面就播放一下你准备好的歌曲吧。


/**************************************************************************/
* 版权声明
* 本教程只在CSDN安豆网发布,其他网站出现本教程均属侵权。
/
**************************************************************************/