程序员人生 网站导航

手把手教你做音乐播放器(二)技术原理与框架设计

栏目:综合技术时间:2016-09-27 08:39:20

第2节 技术原理与框架设计

在开始正式开发功能之前,我们需要对要完成的功能做1个技术验证,确保有足够的能力和技术积累能完成它。

以后再根据调查的结果,设计程序的结构。这就好比造房子之前要计划好蓝图,不然房子极可能造着造着就暴露出很多没有想到的问题。

2.1 播放音乐

安卓系统作为1个利用开发的框架,为我们提供了丰富的工具,包括了音乐播放支持,很多格式的音乐都能播放。正因如此,我们才不需要从第1行代码开始去研究各种音频格式,不用去斟酌2进制格式的音频文件该如何解包、如何解码等等。

只需要告知系统,我有1个音频文件,要交给你播放,怎样播放的我不管,你全权负责,只需要把播放时的状态向我报告就行了。

安卓系统提供的组件MediaPlayer就可以实现音频文件的播放,我们只需要遵守以下的步骤,

  1. 创建1个MediaPlayer对象,

    MediaPlayer mMusicPlayer = new MediaPlayer();
  2. MediaPlayer设置要播放的文件,可以是文件的物理地址,也能够是文件的Uri地址,

    mMusicPlayer.setDataSource(context, songUri);
  3. 设置完成参数,准备播放,

    mMusicPlayer.prepare();
  4. 播放、暂停、停止播放,

    //开始播放 mMusicPlayer.start(); //暂停播放 mMusicPlayer.pause(); //停止播放 mMusicPlayer.stop(); //重置播放器 mMusicPlayer.reset(); //跳转到特定时间 mMusicPlayer.seekTo();
  5. 通过设置监听器,获得播放器返回的各种播放状态,

    //注册监听器,监听音乐是不是播放完成 mMusicPlayer.setOnCompletionListener(mOnCompletionListener); private MediaPlayer.OnCompletionListener mOnCompletionListener = new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { //完成播放后会触发这里被调用 } }; //注册监听器,监听音乐是不是播放毛病 mMusicPlayer.setOnErrorListener(null);

例如播放1个Uir地址为content://media/external/audio/media/20422的音乐,

try { Uri songUri = Uri.parse("content://media/external/audio/media/20422"); MediaPlayer mMusicPlayer = new MediaPlayer(); mMusicPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { //完成播放后会触发这里被调用 } }); mMusicPlayer.setDataSource(MusicListActivity.this, songUri); mMusicPlayer.prepare(); mMusicPlayer.start(); } catch (IOException e) { e.printStackTrace(); }

如果你此时对Uri其实不熟习,没有关系,就把它当作文件的1个地址就行了,我们会在后面的章节做详细的介绍。

2.2 播放列表的存储

播放列表需要能长时间的存储起来,即便程序退出了,下次启动的时候也能得到上次等待播放的音乐任务。

这里我们将正在播放的音乐列表存储到安卓系统提供的SQLite数据库中。

这个数据库可以被要获得它保存的数据的组件直接使用,也能够被封装在自定义的ContentProvider当中,让他人通过查询ContentProvider来间接使用。

ContentProvider是安卓开发中很重要的组件之1,可以向其他组件提供数据访问的能力。它就像是1个网站,其他组件(或其他利用)可以通过“网址”访问它,获得需要的信息。因此它可以作为不同利用之间同享数据的1种方式。

以后很多利用的开发可能都会与它打交道,都需要我们自定义1个适合的ContentProvider。所以我们就借此机会来学习如何自定义1个ContentProvider吧。

自定义1个ContentProvider,需要

  1. 继承ContentProvider类重新创建1个类,并实现其中的1些方法;
  2. 在利用的AndroidManifest.xml文件中,声明这个新添加的组件;

在这里,我们将利用它来存储播放列表。

2.3 Service组件

启动主界面的Activity,在该Activity中创建MediaPlayer,让它来播放音乐看起来是可以的,不过这类设计有个很严重的问题-音乐不能在后台播放,也就是说你不能1边听音乐,1边刷微博。

缘由很简单,当前的程序结构将系统的MediaPlayer与播放器的主界面Activity关联在1起。当主界面的Activity被用户按下了返回键时,它会被系统烧毁。逻辑上讲,主界面Activity所包括的MediaPlayer也就应当与世长辞了,怎样还能让它来继续播放音乐呢?!

所以在此,我们需要1个能够在主界面Activity退出以后,还能保证让MediaPlayer继续工作的方案。这个问题的解决方案,将有安卓系统的另外一个重要组件Service提供。

Service就像是个不需要界面显示的Activity(虽然不太严谨,但大体上可以这样想象,帮助我们理解新的概念),它运行在系统的后台,当系统资源不足需要进行强行的资源回收时,回收优先级也比那些没有显示出来的Activity低,正是我们用来拜托播放音乐最好的组件。

2.4 桌面小工具

桌面小工具的实现,由安卓系统给出了专门的设计方案。

桌面小工具是安卓系统桌面框架的1部份,不需要我们挖空心思从头设计,只要依照它的设计规则来开发就能够了。

在项目工程上点击右键,选择new->Wideget->App Widget就为我们创建好了开发用的模版,非常的简单方便。

2.5 程序框架

基于上面的分析,我们将全部利用的框架做了大致的梳理,

  1. 主界面ActivityMusicListActivity:展现音乐列表,当前播放进度;它与播放服务建立联系,获得播放列表和播放控制接口;

  2. 播放列表记录存储模块-PlayListContentProvider:记录当前的播放列表;提供给播放服务使用;

  3. 播放服务-MusicService:对外,为主界面MusicListActivity提供控制音乐播放、操作播放列表的接口;对内从PlayListContentProvider获得播放列表的操作,具有MediaPlayer对象,实际的控制播放器;

  4. 桌面小工具-AnddleMusicAppWidget:与MusicService联系,提供主界面上快速控制音乐播放流程的便捷方式;

第2节 技术原理与框架设计

在开始正式开发功能之前,我们需要对要完成的功能做1个技术验证,确保有足够的能力和技术积累能完成它。

以后再根据调查的结果,设计程序的结构。这就好比造房子之前要计划好蓝图,不然房子极可能造着造着就暴露出很多没有想到的问题。

2.1 播放音乐

安卓系统作为1个利用开发的框架,为我们提供了丰富的工具,包括了音乐播放支持,很多格式的音乐都能播放。正因如此,我们才不需要从第1行代码开始去研究各种音频格式,不用去斟酌2进制格式的音频文件该如何解包、如何解码等等。

只需要告知系统,我有1个音频文件,要交给你播放,怎样播放的我不管,你全权负责,只需要把播放时的状态向我报告就行了。

安卓系统提供的组件MediaPlayer就可以实现音频文件的播放,我们只需要遵守以下的步骤,

  1. 创建1个MediaPlayer对象,

    MediaPlayer mMusicPlayer = new MediaPlayer();
  2. MediaPlayer设置要播放的文件,可以是文件的物理地址,也能够是文件的Uri地址,

    mMusicPlayer.setDataSource(context, songUri);
  3. 设置完成参数,准备播放,

    mMusicPlayer.prepare();
  4. 播放、暂停、停止播放,

    //开始播放 mMusicPlayer.start(); //暂停播放 mMusicPlayer.pause(); //停止播放 mMusicPlayer.stop(); //重置播放器 mMusicPlayer.reset(); //跳转到特定时间 mMusicPlayer.seekTo();
  5. 通过设置监听器,获得播放器返回的各种播放状态,

    //注册监听器,监听音乐是不是播放完成 mMusicPlayer.setOnCompletionListener(mOnCompletionListener); private MediaPlayer.OnCompletionListener mOnCompletionListener = new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { //完成播放后会触发这里被调用 } }; //注册监听器,监听音乐是不是播放毛病 mMusicPlayer.setOnErrorListener(null);

例如播放1个Uir地址为content://media/external/audio/media/20422的音乐,

try { Uri songUri = Uri.parse("content://media/external/audio/media/20422"); MediaPlayer mMusicPlayer = new MediaPlayer(); mMusicPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { //完成播放后会触发这里被调用 } }); mMusicPlayer.setDataSource(MusicListActivity.this, songUri); mMusicPlayer.prepare(); mMusicPlayer.start(); } catch (IOException e) { e.printStackTrace(); }

如果你此时对Uri其实不熟习,没有关系,就把它当作文件的1个地址就行了,我们会在后面的章节做详细的介绍。

2.2 播放列表的存储

播放列表需要能长时间的存储起来,即便程序退出了,下次启动的时候也能得到上次等待播放的音乐任务。

这里我们将正在播放的音乐列表存储到安卓系统提供的SQLite数据库中。

这个数据库可以被要获得它保存的数据的组件直接使用,也能够被封装在自定义的ContentProvider当中,让他人通过查询ContentProvider来间接使用。

ContentProvider是安卓开发中很重要的组件之1,可以向其他组件提供数据访问的能力。它就像是1个网站,其他组件(或其他利用)可以通过“网址”访问它,获得需要的信息。因此它可以作为不同利用之间同享数据的1种方式。

以后很多利用的开发可能都会与它打交道,都需要我们自定义1个适合的ContentProvider。所以我们就借此机会来学习如何自定义1个ContentProvider吧。

自定义1个ContentProvider,需要

  1. 继承ContentProvider类重新创建1个类,并实现其中的1些方法;
  2. 在利用的AndroidManifest.xml文件中,声明这个新添加的组件;

在这里,我们将利用它来存储播放列表。

2.3 Service组件

启动主界面的Activity,在该Activity中创建MediaPlayer,让它来播放音乐看起来是可以的,不过这类设计有个很严重的问题-音乐不能在后台播放,也就是说你不能1边听音乐,1边刷微博。

缘由很简单,当前的程序结构将系统的MediaPlayer与播放器的主界面Activity关联在1起。当主界面的Activity被用户按下了返回键时,它会被系统烧毁。逻辑上讲,主界面Activity所包括的MediaPlayer也就应当与世长辞了,怎样还能让它来继续播放音乐呢?!

所以在此,我们需要1个能够在主界面Activity退出以后,还能保证让MediaPlayer继续工作的方案。这个问题的解决方案,将有安卓系统的另外一个重要组件Service提供。

Service就像是个不需要界面显示的Activity(虽然不太严谨,但大体上可以这样想象,帮助我们理解新的概念),它运行在系统的后台,当系统资源不足需要进行强行的资源回收时,回收优先级也比那些没有显示出来的Activity低,正是我们用来拜托播放音乐最好的组件。

2.4 桌面小工具

桌面小工具的实现,由安卓系统给出了专门的设计方案。

桌面小工具是安卓系统桌面框架的1部份,不需要我们挖空心思从头设计,只要依照它的设计规则来开发就能够了。

在项目工程上点击右键,选择new->Wideget->App Widget就为我们创建好了开发用的模版,非常的简单方便。

2.5 程序框架

基于上面的分析,我们将全部利用的框架做了大致的梳理,

  1. 主界面ActivityMusicListActivity:展现音乐列表,当前播放进度;它与播放服务建立联系,获得播放列表和播放控制接口;

  2. 播放列表记录存储模块-PlayListContentProvider:记录当前的播放列表;提供给播放服务使用;

  3. 播放服务-MusicService:对外,为主界面MusicListActivity提供控制音乐播放、操作播放列表的接口;对内从PlayListContentProvider获得播放列表的操作,具有MediaPlayer对象,实际的控制播放器;

  4. 桌面小工具-AnddleMusicAppWidget:与MusicService联系,提供主界面上快速控制音乐播放流程的便捷方式;


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

*另外,我们还推出了Arduino智能硬件相干的教程,您可以在我们的网店安豆的杂货铺中购买相干硬件。同时也感谢大家对我们这些码农的支持。

*最后再次感谢各位读者对安豆的支持,谢谢:)
/*******************************************************************/

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐