当前位置: 代码迷 >> Android >> Android增高第一篇之MediaPlayer
  详细解决方案

Android增高第一篇之MediaPlayer

热度:59   发布时间:2016-05-01 20:17:16.0
Android提高第一篇之MediaPlayer

本文来自http://blog.csdn.net/hellogv/?,引用必须注明出处!?

??????? 前面写了十四篇关于界面的入门文章,大家都看完和跟着练习之后,对于常用的Layout和View都会有一定的了解了,接下来的文章就不再强调介绍界面了,而是针对具体的常见功能而展开。

????????本文介绍MediaPlayer的使用。MediaPlayer可以播放音频和视频,另外也可以通过VideoView来播放视频,虽然VideoView比MediaPlayer简单易用,但定制性不如用MediaPlayer,要视情况选择了。MediaPlayer播放音频比较简单,但是要播放视频就需要SurfaceView。SurfaceView比普通的自定义View更有绘图上的优势,它支持完全的OpenGL ES库。

???????? 先贴出本文程序运行结果的截图,上面是播放/停止音频,可用SeekBar来调进度,下面是播放/停止视频,也是用SeekBar来调进度:

?

main.xml的源码:

[xhtml]?view plaincopyprint?
  1. <?xml?version="1.0"?encoding="utf-8"?>??
  2. <LinearLayout?android:id="@+id/LinearLayout01"??
  3. ????android:layout_width="fill_parent"?android:layout_height="fill_parent"??
  4. ????xmlns:android="http://schemas.android.com/apk/res/android"??
  5. ????android:orientation="vertical">??
  6. ????<SeekBar?android:id="@+id/SeekBar01"?android:layout_height="wrap_content"??
  7. ????????android:layout_width="fill_parent"></SeekBar>??
  8. ????<LinearLayout?android:id="@+id/LinearLayout02"??
  9. ????????android:layout_width="wrap_content"?android:layout_height="wrap_content">??
  10. ????????<Button?android:id="@+id/Button01"?android:layout_width="wrap_content"??
  11. ????????????android:layout_height="wrap_content"?android:text="播放音频"></Button>??
  12. ????????<Button?android:id="@+id/Button02"?android:layout_width="wrap_content"??
  13. ????????????android:layout_height="wrap_content"?android:text="停止播放"></Button>??
  14. ????</LinearLayout>??
  15. ????<SeekBar?android:id="@+id/SeekBar02"?android:layout_height="wrap_content"??
  16. ????????android:layout_width="fill_parent"></SeekBar>??
  17. ??
  18. ????<SurfaceView?android:id="@+id/SurfaceView01"??
  19. ????????android:layout_width="fill_parent"?android:layout_height="250px"></SurfaceView>??
  20. ????<LinearLayout?android:id="@+id/LinearLayout02"??
  21. ????????android:layout_width="wrap_content"?android:layout_height="wrap_content">??
  22. ????????<Button?android:layout_width="wrap_content"??
  23. ????????????android:layout_height="wrap_content"?android:id="@+id/Button03"??
  24. ????????????android:text="播放视频"></Button>??
  25. ????????<Button?android:layout_width="wrap_content"??
  26. ????????????android:layout_height="wrap_content"?android:text="停止播放"?android:id="@+id/Button04"></Button>??
  27. ????</LinearLayout>??
  28. </LinearLayout>??

?

?

本文程序的源码,有点长:

[java]?view plaincopyprint?
  1. package?com.testMedia;??
  2. ??
  3. import?java.io.IOException;????
  4. import?java.util.Timer;??
  5. import?java.util.TimerTask;??
  6. import?android.app.Activity;????
  7. import?android.media.AudioManager;??
  8. import?android.media.MediaPlayer;??
  9. import?android.os.Bundle;????
  10. import?android.view.SurfaceHolder;??
  11. import?android.view.SurfaceView;??
  12. import?android.view.View;????
  13. import?android.widget.Button;????
  14. import?android.widget.SeekBar;??
  15. import?android.widget.Toast;????
  16. ??
  17. ??
  18. public?class?testMedia?extends?Activity?{??
  19. ??????/**?Called?when?the?activity?is?first?created.?*/???
  20. ??
  21. ????private?SeekBar?skb_audio=null;??
  22. ????private?Button?btn_start_audio?=?null;????
  23. ????private?Button?btn_stop_audio?=?null;??
  24. ??
  25. ????private?SeekBar?skb_video=null;??
  26. ????private?Button?btn_start_video?=?null;????
  27. ????private?Button?btn_stop_video?=?null;??
  28. ????private?SurfaceView?surfaceView;???
  29. ????private?SurfaceHolder?surfaceHolder;???
  30. ??????
  31. ????private?MediaPlayer?m?=?null;????
  32. ????private?Timer?mTimer;??
  33. ????private?TimerTask?mTimerTask;??
  34. ??????
  35. ????private?boolean?isChanging=false;//互斥变量,防止定时器与SeekBar拖动时进度冲突??
  36. ?????@Override????
  37. ????public?void?onCreate(Bundle?savedInstanceState)?{????
  38. ????????super.onCreate(savedInstanceState);????
  39. ????????setContentView(R.layout.main);????
  40. ??????????
  41. ????????//----------Media控件设置---------//??
  42. ????????m=new?MediaPlayer();??
  43. ??????????
  44. ????????//播放结束之后弹出提示??
  45. ????????m.setOnCompletionListener(new?MediaPlayer.OnCompletionListener(){??
  46. ????????????@Override??
  47. ????????????public?void?onCompletion(MediaPlayer?arg0)?{??
  48. ????????????????Toast.makeText(testMedia.this,?"结束",?1000).show();??
  49. ????????????????m.release();??
  50. ????????????}??
  51. ????????});??
  52. ??????????
  53. ??????//----------定时器记录播放进度---------//??
  54. ????????mTimer?=?new?Timer();??
  55. ????????mTimerTask?=?new?TimerTask()?{??
  56. ????????????@Override??
  57. ????????????public?void?run()?{???
  58. ????????????????if(isChanging==true)??
  59. ????????????????????return;??
  60. ??????????????????
  61. ????????????????if(m.getVideoHeight()==0)??
  62. ????????????????????skb_audio.setProgress(m.getCurrentPosition());??
  63. ????????????????else???
  64. ????????????????????skb_video.setProgress(m.getCurrentPosition());??
  65. ????????????}??
  66. ????????};??
  67. ??
  68. ????????mTimer.schedule(mTimerTask,?0,?10);??
  69. ??????????
  70. ????????btn_start_audio?=?(Button)?this.findViewById(R.id.Button01);????
  71. ????????btn_stop_audio?=?(Button)?this.findViewById(R.id.Button02);????
  72. ????????btn_start_audio.setOnClickListener(new?ClickEvent());??
  73. ????????btn_stop_audio.setOnClickListener(new?ClickEvent());??
  74. ????????skb_audio=(SeekBar)this.findViewById(R.id.SeekBar01);??
  75. ????????skb_audio.setOnSeekBarChangeListener(new?SeekBarChangeEvent());??
  76. ??????????
  77. ????????btn_start_video?=?(Button)?this.findViewById(R.id.Button03);????
  78. ????????btn_stop_video?=?(Button)?this.findViewById(R.id.Button04);????
  79. ????????btn_start_video.setOnClickListener(new?ClickEvent());??
  80. ????????btn_stop_video.setOnClickListener(new?ClickEvent());??
  81. ????????skb_video=(SeekBar)this.findViewById(R.id.SeekBar02);??
  82. ????????skb_video.setOnSeekBarChangeListener(new?SeekBarChangeEvent());??
  83. ????????surfaceView?=?(SurfaceView)?findViewById(R.id.SurfaceView01);??
  84. ????????surfaceHolder?=?surfaceView.getHolder();??
  85. ????????surfaceHolder.setFixedSize(100,?100);??
  86. ????????surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);??
  87. ????}????
  88. ???????
  89. ??/*?
  90. ???*?按键事件处理?
  91. ???*/??
  92. ??class?ClickEvent?implements?View.OnClickListener{??
  93. ????@Override??
  94. ????public?void?onClick(View?v)?{??
  95. ????????if(v==btn_start_audio)??
  96. ????????{??
  97. ????????????m.reset();//恢复到未初始化的状态??
  98. ????????????m=MediaPlayer.create(testMedia.this,?R.raw.big);//读取音频??
  99. ????????????skb_audio.setMax(m.getDuration());//设置SeekBar的长度??
  100. ????????????try?{?????????????????????
  101. ????????????????m.prepare();????//准备??
  102. ????????????}?catch?(IllegalStateException?e)?{???????????
  103. ????????????????//?TODO?Auto-generated?catch?block????????????????
  104. ????????????????e.printStackTrace();??????????????????
  105. ????????????}?catch?(IOException?e)?{?????????????
  106. ????????????????//?TODO?Auto-generated?catch?block????????????????
  107. ????????????????e.printStackTrace();??????????????????
  108. ????????????}?????????
  109. ????????????m.start();??//播放??
  110. ????????}??
  111. ????????else?if(v==btn_stop_audio?||?v==btn_stop_video)??
  112. ????????{??
  113. ????????????m.stop();??
  114. ????????}??
  115. ????????else?if(v==btn_start_video)??
  116. ????????{??
  117. ????????????m.reset();//恢复到未初始化的状态??
  118. ????????????m=MediaPlayer.create(testMedia.this,?R.raw.test);//读取视频??
  119. ????????????skb_video.setMax(m.getDuration());//设置SeekBar的长度??
  120. ????????????m.setAudioStreamType(AudioManager.STREAM_MUSIC);??
  121. ????????????m.setDisplay(surfaceHolder);//设置屏幕??
  122. ??????????????
  123. ????????????try?{??
  124. ????????????????m.prepare();??
  125. ??????????????????
  126. ????????????}?catch?(IllegalArgumentException?e)?{??
  127. ????????????????//?TODO?Auto-generated?catch?block??
  128. ????????????????e.printStackTrace();??
  129. ????????????}?catch?(IllegalStateException?e)?{??
  130. ????????????????//?TODO?Auto-generated?catch?block??
  131. ????????????????e.printStackTrace();??
  132. ????????????}?catch?(IOException?e)?{??
  133. ????????????????//?TODO?Auto-generated?catch?block??
  134. ????????????????e.printStackTrace();??
  135. ????????????}??
  136. ????????????m.start();??
  137. ????????}??
  138. ????}??
  139. ??}??
  140. ????
  141. ??/*?
  142. ???*?SeekBar进度改变事件?
  143. ???*/??
  144. ??class?SeekBarChangeEvent?implements?SeekBar.OnSeekBarChangeListener{??
  145. ??
  146. ????@Override??
  147. ????public?void?onProgressChanged(SeekBar?seekBar,?int?progress,??
  148. ????????????boolean?fromUser)?{??
  149. ????????//?TODO?Auto-generated?method?stub??
  150. ??????????
  151. ????}??
  152. ??
  153. ????@Override??
  154. ????public?void?onStartTrackingTouch(SeekBar?seekBar)?{??
  155. ????????isChanging=true;??
  156. ????}??
  157. ??
  158. ????@Override??
  159. ????public?void?onStopTrackingTouch(SeekBar?seekBar)?{??
  160. ????????m.seekTo(seekBar.getProgress());??
  161. ????????isChanging=false;?????
  162. ????}??
  163. ????????
  164. ??}??
  165. ??
  166. }??

?

?

  相关解决方案