Android的MediaPlayer包含了Audio和video的播放功能,在Android的界面上,Music和Video两个应用程序都是调用MediaPlayer实现的。

MediaPlayer在底层是基于OpenCore(PacketVideo)的库实现的,为了构建一个MediaPlayer程序,上层还包含了进程间通讯等内容,这种进程间通讯的基础是Android基本库中的Binder机制。

首先我们的播放器可能不只是希望播放一种格式的音乐,而且还需要自动识别指定的路径中哪些是可以播放的音频文件,哪些是不支持的格式,我们可以通过下面的代码来过滤文件类型:

Java代码
  1. classMusicFilterimplementsFilenamFilter{
  2. publicbooleanaccept(Filedir,Stringname){
  3. return(name.endWith(".mps3"));
  4. }
  5. }

现在我们已经得到了能够播放的音频文件,如何来实现一个播放列表的界面呢?本例我们使用ListActivity布局来实现。但是我们还需要几个按钮来表示开始、暂停等操作,我们使用ImageButton来实现,下面是我们的播放器的界面。

现在我们需要指定音乐文件的位置,本例我们设置路径为“/sdcard/”,因此我们需要向SD卡中添加音频文件。步骤如下:启动模拟器,在Eclipse上选择DDMS窗口,选择File Explorer标签,向左、向右箭头分别是拷贝进、拷贝出指定位置,减号则是删除选中的文件。

现在我们只需要设置这些ImageButton按钮的时间来处理相应的动作即可播放音乐,首先调用Reset(),这样做将重置MediaPlayer到它的正常状态,这是必须的。如果正在放一首歌曲,同事又想去改变这个数据源,这个Reset()功能也将停止任何正在播放的歌曲。因此,如果一首歌曲是播放状态,同事我们又要选择另一首歌曲,那么它将在启动下一首歌曲之前停止这首正在播放的歌曲。然后我们通过路径找到这首歌曲(setDataSource(String))同事调用prepare()和Start()。在这里指向MediaPlayer将启动播放你的歌曲。接下来的工作就是去装备一个OnCompletionLister(setOnCompletionListener(newOnCompletionListener())).在歌曲结束的时候,onCompletion(MediaPlayer)这个功能将被调用。比如我们可以在这里设置自动播放下一首歌曲。下面我们老看看具体的实现代码。

Java代码
  1. packagecom.yarin.android.Examples_07_01;
  2. importjava.io.File;
  3. importjava.io.FilenameFilter;
  4. importjava.io.IOException;
  5. importjava.util.ArrayList;
  6. importjava.util.List;
  7. importandroid.app.ListActivity;
  8. importandroid.media.MediaPlayer;
  9. importandroid.media.MediaPlayer.OnCompletionListener;
  10. importandroid.os.Bundle;
  11. importandroid.view.KeyEvent;
  12. importandroid.view.View;
  13. importandroid.widget.ArrayAdapter;
  14. importandroid.widget.ImageButton;
  15. importandroid.widget.ListView;
  16. publicclassActivity01extendsListActivity
  17. {
  18. /*几个操作按钮*/
  19. privateImageButtonmFrontImageButton=null;
  20. privateImageButtonmStopImageButton=null;
  21. privateImageButtonmStartImageButton=null;
  22. privateImageButtonmPauseImageButton=null;
  23. privateImageButtonmNextImageButton=null;
  24. /*MediaPlayer对象*/
  25. publicMediaPlayermMediaPlayer=null;
  26. /*播放列表*/
  27. privateList<String>mMusicList=newArrayList<String>();
  28. /*当前播放歌曲的索引*/
  29. privateintcurrentListItme=0;
  30. /*音乐的路径*/
  31. privatestaticfinalStringMUSIC_PATH=newString("/sdcard/");
  32. /**Calledwhentheactivityisfirstcreated.*/
  33. @Override
  34. publicvoidonCreate(BundlesavedInstanceState)
  35. {
  36. super.onCreate(savedInstanceState);
  37. setContentView(R.layout.main);
  38. /*更新显示播放列表*/
  39. musicList();
  40. /*构建MediaPlayer对象*/
  41. mMediaPlayer=newMediaPlayer();
  42. mFrontImageButton=(ImageButton)findViewById(R.id.LastImageButton);
  43. mStopImageButton=(ImageButton)findViewById(R.id.StopImageButton);
  44. mStartImageButton=(ImageButton)findViewById(R.id.StartImageButton);
  45. mPauseImageButton=(ImageButton)findViewById(R.id.PauseImageButton);
  46. mNextImageButton=(ImageButton)findViewById(R.id.NextImageButton);
  47. //停止按钮
  48. mStopImageButton.setOnClickListener(newImageButton.OnClickListener()
  49. {
  50. @Override
  51. publicvoidonClick(Viewv)
  52. {
  53. /*是否正在播放*/
  54. if(mMediaPlayer.isPlaying())
  55. {
  56. //重置MediaPlayer到初始状态
  57. mMediaPlayer.reset();
  58. }
  59. }
  60. });
  61. //开始按钮
  62. mStartImageButton.setOnClickListener(newImageButton.OnClickListener()
  63. {
  64. @Override
  65. publicvoidonClick(Viewv)
  66. {
  67. playMusic(MUSIC_PATH+mMusicList.get(currentListItme));
  68. }
  69. });
  70. //暂停
  71. mPauseImageButton.setOnClickListener(newImageButton.OnClickListener()
  72. {
  73. publicvoidonClick(Viewview)
  74. {
  75. if(mMediaPlayer.isPlaying())
  76. {
  77. /*暂停*/
  78. mMediaPlayer.pause();
  79. }
  80. else
  81. {
  82. /*开始播放*/
  83. mMediaPlayer.start();
  84. }
  85. }
  86. });
  87. //下一首
  88. mNextImageButton.setOnClickListener(newImageButton.OnClickListener()
  89. {
  90. @Override
  91. publicvoidonClick(Viewarg0)
  92. {
  93. nextMusic();
  94. }
  95. });
  96. //上一首
  97. mFrontImageButton.setOnClickListener(newImageButton.OnClickListener()
  98. {
  99. @Override
  100. publicvoidonClick(Viewarg0)
  101. {
  102. FrontMusic();
  103. }
  104. });
  105. }
  106. publicbooleanonKeyDown(intkeyCode,KeyEventevent)
  107. {
  108. if(keyCode==KeyEvent.KEYCODE_BACK)
  109. {
  110. mMediaPlayer.stop();
  111. mMediaPlayer.release();
  112. this.finish();
  113. returntrue;
  114. }
  115. returnsuper.onKeyDown(keyCode,event);
  116. }
  117. @Override
  118. /*当我们点击列表时,播放被点击的音乐*/
  119. protectedvoidonListItemClick(ListViewl,Viewv,intposition,longid)
  120. {
  121. currentListItme=position;
  122. playMusic(MUSIC_PATH+mMusicList.get(position));
  123. }
  124. /*播放列表*/
  125. publicvoidmusicList()
  126. {
  127. //取得指定位置的文件设置显示到播放列表
  128. Filehome=newFile(MUSIC_PATH);
  129. if(home.listFiles(newMusicFilter()).length>0)
  130. {
  131. for(Filefile:home.listFiles(newMusicFilter()))
  132. {
  133. mMusicList.add(file.getName());
  134. }
  135. ArrayAdapter<String>musicList=newArrayAdapter<String>(Activity01.this,R.layout.musicitme,mMusicList);
  136. setListAdapter(musicList);
  137. }
  138. }
  139. privatevoidplayMusic(Stringpath)
  140. {
  141. try
  142. {
  143. /*重置MediaPlayer*/
  144. mMediaPlayer.reset();
  145. /*设置要播放的文件的路径*/
  146. mMediaPlayer.setDataSource(path);
  147. /*准备播放*/
  148. mMediaPlayer.prepare();
  149. /*开始播放*/
  150. mMediaPlayer.start();
  151. mMediaPlayer.setOnCompletionListener(newOnCompletionListener()
  152. {
  153. publicvoidonCompletion(MediaPlayerarg0)
  154. {
  155. //播放完成一首之后进行下一首
  156. nextMusic();
  157. }
  158. });
  159. }catch(IOExceptione){}
  160. }
  161. /*下一首*/
  162. privatevoidnextMusic()
  163. {
  164. if(++currentListItme>=mMusicList.size())
  165. {
  166. currentListItme=0;
  167. }
  168. else
  169. {
  170. playMusic(MUSIC_PATH+mMusicList.get(currentListItme));
  171. }
  172. }
  173. /*上一首*/
  174. privatevoidFrontMusic()
  175. {
  176. if(--currentListItme>=0)
  177. {
  178. currentListItme=mMusicList.size();
  179. }
  180. else
  181. {
  182. playMusic(MUSIC_PATH+mMusicList.get(currentListItme));
  183. }
  184. }
  185. }
  186. /*过滤文件类型*/
  187. classMusicFilterimplementsFilenameFilter
  188. {
  189. publicbooleanaccept(Filedir,Stringname)
  190. {
  191. //这里还可以设置其他格式的音乐文件
  192. return(name.endsWith(".mp3"));
  193. }
  194. }

现在我们已经知道如何播放指定SD卡上的音乐了,但是大家是否想到,我们在应用时(比如游戏中的音效),肯定是需要和我们的程序一起打包发布的,这样音乐就没有存在于SD卡上了,一般情况下会放在应用的目录下的“res\raw\”中,那么如何播放这样的音乐呢,其实很简单,只需要把上面的例子中的setDataSource 方法改成有create方法来创建一个指定的资源索引的MediaPlayer对象,其他操作基本一。代码如下:

Java代码
  1. packagecom.yarin.android.Examples_07_02;
  2. importjava.io.IOException;
  3. importandroid.app.Activity;
  4. importandroid.media.MediaPlayer;
  5. importandroid.media.MediaPlayer.OnCompletionListener;
  6. importandroid.os.Bundle;
  7. importandroid.view.KeyEvent;
  8. importandroid.view.View;
  9. importandroid.widget.ImageButton;
  10. importandroid.widget.TextView;
  11. publicclassActivity01extendsActivity
  12. {
  13. privateImageButtonmStopImageButton;
  14. privateImageButtonmStartImageButton;
  15. privateImageButtonmPauseImageButton;
  16. privateTextViewmTextView;
  17. privatebooleanbIsReleased=false;
  18. privatebooleanbIsPaused=false;
  19. privatebooleanbIsPlaying=false;
  20. publicMediaPlayermMediaPlayer=newMediaPlayer();;
  21. /**Calledwhentheactivityisfirstcreated.*/
  22. @Override
  23. publicvoidonCreate(BundlesavedInstanceState)
  24. {
  25. super.onCreate(savedInstanceState);
  26. setContentView(R.layout.main);
  27. mStopImageButton=(ImageButton)findViewById(R.id.StopImageButton);
  28. mStartImageButton=(ImageButton)findViewById(R.id.StartImageButton);
  29. mPauseImageButton=(ImageButton)findViewById(R.id.PauseImageButton);
  30. mTextView=(TextView)findViewById(R.id.TextView01);
  31. //停止按钮
  32. mStopImageButton.setOnClickListener(newImageButton.OnClickListener()
  33. {
  34. @Override
  35. publicvoidonClick(Viewv)
  36. {
  37. if(bIsPlaying==true)
  38. {
  39. if(!bIsReleased)
  40. {
  41. mMediaPlayer.stop();
  42. mMediaPlayer.release();
  43. bIsReleased=true;
  44. }
  45. bIsPlaying=false;
  46. mTextView.setText("当前处于停止状态,请按开始进行音乐播放!");
  47. }
  48. }
  49. });
  50. //开始按钮
  51. mStartImageButton.setOnClickListener(newImageButton.OnClickListener()
  52. {
  53. @Override
  54. publicvoidonClick(Viewv)
  55. {
  56. try
  57. {
  58. if(!bIsPlaying)
  59. {
  60. bIsPlaying=true;
  61. /*装载资源中的音乐*/
  62. mMediaPlayer=MediaPlayer.create(Activity01.this,R.raw.test);
  63. bIsReleased=false;
  64. /*设置是否循环*/
  65. mMediaPlayer.setLooping(true);
  66. try
  67. {
  68. mMediaPlayer.prepare();
  69. }
  70. catch(IllegalStateExceptione)
  71. {
  72. e.printStackTrace();
  73. }
  74. catch(IOExceptione)
  75. {
  76. e.printStackTrace();
  77. }
  78. mMediaPlayer.start();
  79. mTextView.setText("当前正在播放音乐!");
  80. }
  81. }
  82. catch(IllegalStateExceptione)
  83. {
  84. e.printStackTrace();
  85. }
  86. mMediaPlayer.setOnCompletionListener(newOnCompletionListener()
  87. {
  88. //@Override
  89. publicvoidonCompletion(MediaPlayerarg0)
  90. {
  91. mMediaPlayer.release();
  92. }
  93. });
  94. }
  95. });
  96. //暂停
  97. mPauseImageButton.setOnClickListener(newImageButton.OnClickListener()
  98. {
  99. publicvoidonClick(Viewview)
  100. {
  101. if(mMediaPlayer!=null)
  102. {
  103. if(bIsReleased==false)
  104. {
  105. if(bIsPaused==false)
  106. {
  107. mMediaPlayer.pause();
  108. bIsPaused=true;
  109. bIsPlaying=true;
  110. mTextView.setText("已经暂停,请再次按暂停按钮回复播放!");
  111. }
  112. elseif(bIsPaused==true)
  113. {
  114. mMediaPlayer.start();
  115. bIsPaused=false;
  116. mTextView.setText("音乐恢复播放!");
  117. }
  118. }
  119. }
  120. }
  121. });
  122. }
  123. publicbooleanonKeyDown(intkeyCode,KeyEventevent)
  124. {
  125. if(keyCode==KeyEvent.KEYCODE_BACK)
  126. {
  127. if(!bIsReleased)
  128. {
  129. mMediaPlayer.stop();
  130. mMediaPlayer.release();
  131. bIsReleased=true;
  132. }
  133. this.finish();
  134. returntrue;
  135. }
  136. returnsuper.onKeyDown(keyCode,event);
  137. }
  138. }

细心的读者已经发现create方法不仅可以加载应用程序中资源的索引,还可加载一个URI地址,当然这就说明我们同样可以很轻松地播放网络音乐,核心代码如下:

Java代码
  1. PrivateMediaPlayermMediaPlayer;
  2. Uriuri=Uri.parse("http://www.xxx.com.xxx.mp3");
  3. mMediaPlayer=MediaPlayer.create(this,uri);
  4. mMediaPlayer.start();

更多相关文章

  1. Android(安卓)基本Dialog和自定义Dialog
  2. Android学习笔记(4)——Android(安卓)Application是如何运行的
  3. ROS(indigo) turtlebot2 + android一些有趣应用
  4. android 按钮设计中state_selected属性
  5. Android持久化之SharedPreferences
  6. Android(安卓)设定横屏,禁止屏幕旋转,Activity重置 [更新视频播放
  7. Button 按钮的几个属性
  8. iphone开发之常用控件的使用详解
  9. android 按钮设计中state_selected属性

随机推荐

  1. [置顶] Androd用WebView播放gif动画
  2. Android Read Only File System IOExcept
  3. android 前后台运行判断(使用场景如:在app
  4. 多个launcher时开机只启动默认的
  5. Android 实现模拟按键方法一
  6. android list view
  7. android textview改变部分文字的颜色
  8. android软件键盘隐藏
  9. Android中Dialog中自定义EditView导致软
  10. Android回到底部和返回顶部实现