Android多媒体MediaPlayer使用详解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Android多媒体MediaPlayer使⽤详解
现在的⼿机功能越来越丰富了,遥想10年前,MP3,MP4,MP5,还是很流⾏的,博主当时读⾼中时很想拥有⼀台,可以听⾳乐和看电影。

可是条件有限,学校也禁⽌此东西,所以只能偷偷的玩。

⽽现在我们的⼿机也很早以前就⽀持了这些功能,⽽且界⾯和功能也远远超过了MP4。

好吧,说多了,今天本⽂介绍的是Andriod系统⾃带的Mediaplayer,和VideoView实现简单的⾳乐和视频的播放,⾄于想做出如酷狗⾳乐这样的APP的话,只要想做,应该也不难,都是基于此实现了功能的扩展。

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

⼀、播放⾳频⽂件
⾸先看看MediaPlaer的⽣命周期
下⾯是MediaPlayer提供的常⽤⽅法
⽅法说明
MediaPlayer构造⽅法
create创建⼀个要播放的多媒体
getCurrentPosition得到当前播放位置
getDuration得到⽂件的时间
getVideoHeight得到视频的⾼度
getVideoWidth得到视频的宽度
isLooping是否循环播放
isPlaying是否正在播放
pause暂停
prepare准备(同步)
prepareAsync准备(异步)
release释放MediaPlayer对象相关的资源
reset重置MediaPlayer对象为刚刚创建的状态
seekTo指定播放的位置(以毫秒为单位的时间)
setAudioStreamType设置流媒体的类型
setDataSource设置多媒体数据来源(位置)
setDisplay设置⽤SurfaceHolder来显⽰多媒体
setLooping设置是否循环播放
setOnButteringUpdateListener⽹络流媒体的缓冲监听
setOnErrorListener设置错误信息监听
setOnVideoSizeChangedListener视频尺⼨监听
setScreenOnWhilePlaying设置是否使⽤SurfaceHolder来保持屏幕显⽰
setVolume设置⾳量
start开始播放
stop停⽌播放
MediaPlayer的⼯作流程是这样的:
1,⾸先创建MediaPlaer对象; *
2,然后调⽤setDataSource()⽅法来设置⾳频⽂件的路径;**
3,再调⽤prepare()⽅法使MediaPlayer进⼊到准备状态;
4,调⽤start⽅法就可以播放⾳频。

* 创建MediaPlaer对象有两种⽅式
a 直接new出来
[java]
1. MediaPlayer mp = new MediaPlayer();
b 使⽤create⽅式
[java]
1. MediaPlayer mp = MediaPlayer.create(this, R.raw.test);//这时就不⽤调⽤setDataSource了
当然上⾯⾸先得在res⽂件夹下新建raw⽂件夹,并放置⼀个test⽂件
** 设置播放的⽂件
MediaPlayer要播放的⽂件主要包括3个来源:
a. ⽤户在应⽤中事先⾃带的resource资源
例如:MediaPlayer.create(this, R.raw.test);
b. 存储在SD卡或其他⽂件路径下的媒体⽂件
例如:mp.setDataSource("/sdcard/test.mp3");
c. ⽹络上的媒体⽂件
例如:mp.setDataSource("/music/confucius.mp3");
MediaPlayer的setDataSource⼀共四个⽅法:
setDataSource (String path)
setDataSource (FileDescriptor fd)
setDataSource (Context context, Uri uri)
setDataSource (FileDescriptor fd, long offset, long length)
其中使⽤FileDescriptor时,需要将⽂件放到与res⽂件夹平级的assets⽂件夹⾥,然后使⽤:
AssetFileDescriptor fileDescriptor = getAssets().openFd("rain.mp3");
m_mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(), fileDescriptor.getLength());来设置datasource
先简单看下效果图吧
上⾯的功能⼀看就知道了,就不⽤我说了吧
下⾯是实现代码
activity_main.xml
[html]
1. <LinearLayout xmlns:android="/apk/res/android"
2. android:layout_width="match_parent"
3. android:layout_height="match_parent"
4. android:layout_margin="3dp"
5. android:orientation="vertical" >
6.
7. <LinearLayout
8. android:layout_width="match_parent"
9. android:layout_height="wrap_content"
10. android:orientation="horizontal" >
11.
12. <Button
13. android:id="@+id/play"
14. android:layout_width="0dp"
15. android:layout_height="wrap_content"
16. android:layout_weight="1"
17. android:text="播放" />
18.
19. <Button
20. android:id="@+id/pause"
21. android:layout_width="0dp"
22. android:layout_height="wrap_content"
23. android:layout_weight="1"
24. android:text="暂停" />
25.
26. <Button
27. android:id="@+id/stop"
28. android:layout_width="0dp"
29. android:layout_height="wrap_content"
30. android:layout_weight="1"
31. android:text="停⽌" />
32. </LinearLayout>
33.
34. <SeekBar
35. android:id="@+id/seekbar"
36. android:layout_width="match_parent"
37. android:layout_height="wrap_content"
38. android:max="0"
39. android:progress="0"
40. android:secondaryProgress="0" />
41.
42. <RelativeLayout
43. android:layout_width="match_parent"
44. android:layout_height="wrap_content" >
45.
46. <TextView
47. android:id="@+id/tv"
48. android:layout_width="wrap_content"
49. android:layout_height="wrap_content"
50. android:layout_alignParentLeft="true"
51. android:text="当前时间" />
52.
53. <TextView
54. android:id="@+id/tv2"
55. android:layout_width="wrap_content"
56. android:layout_height="wrap_content"
57. android:layout_alignParentRight="true"
58. android:text="总时间" />
59. </RelativeLayout>
60.
61. </LinearLayout>
MainActivity.java
[java]
1. package com.example.musicplayer;
2.
3. import java.io.File;
4. import java.io.IOException;
5.
6. import android.R.integer;
7. import android.app.Activity;
8. import android.media.MediaPlayer;
9. import android.os.Bundle;
10. import android.os.Environment;
11. import android.os.Handler;
12. import android.os.Message;
13. import android.util.Log;
14. import android.view.Menu;
15. import android.view.MenuItem;
16. import android.view.View;
17. import android.view.View.OnClickListener;
18. import android.widget.Button;
19. import android.widget.SeekBar;
20. import android.widget.SeekBar.OnSeekBarChangeListener;
21. import android.widget.TextView;
22.
23. public class MainActivity extends Activity implements OnClickListener,
24. OnSeekBarChangeListener {
25. private Button play, pause, stop;
26. private MediaPlayer player;
27. private SeekBar mSeekBar;
28. private TextView tv, tv2;
29. private boolean hadDestroy = false;
30. private Handler mHandler = new Handler() {
31. public void handleMessage(android.os.Message msg) {
32.
33. switch (msg.what) {
34. case 0x01:
35.
36. break;
37.
38. default:
39. break;
40. }
41. };
42. };
43. Runnable runnable = new Runnable() {
44.
45. @Override
46. public void run() {
47.
48. if (!hadDestroy) {
49. mHandler.postDelayed(this, 1000);
50. int currentTime = Math
51. .round(player.getCurrentPosition() / 1000);
52. String currentStr = String.format("%s%02d:%02d", "当前时间 ",
53. currentTime / 60, currentTime % 60);
54. tv.setText(currentStr);
55. mSeekBar.setProgress(player.getCurrentPosition());
56. }
57. }
58. };
59.
60. @Override
61. protected void onCreate(Bundle savedInstanceState) {
62. super.onCreate(savedInstanceState);
63. setContentView(yout.activity_main);
64. play = (Button) findViewById(R.id.play);
65. pause = (Button) findViewById(R.id.pause);
66. stop = (Button) findViewById(R.id.stop);
67. mSeekBar = (SeekBar) findViewById(R.id.seekbar);
68. tv = (TextView) findViewById();
69. tv2 = (TextView) findViewById(2);
70. mSeekBar.setOnSeekBarChangeListener(this);
71. play.setOnClickListener(this);
72. pause.setOnClickListener(this);
73. stop.setOnClickListener(this);
74. player = new MediaPlayer();
75. initMediaplayer();
76.
77. }
78.
79. /**
80. * 初始化播放器
81. */
82. private void initMediaplayer() {
83. try {
84. File file = new File(Environment.getExternalStorageDirectory()
85. + "/Download/", "aiqiu.mp3");
86. player.setDataSource(file.getPath());
87. Log.e("播放器", file.toString());
88. player.prepare();
89. } catch (Exception e) {
90. e.printStackTrace();
91. }
92. }
93.
94. @Override
95. public void onClick(View v) {
96. switch (v.getId()) {
97. case R.id.play:
98. if (!player.isPlaying()) {
99. player.start();
100. int totalTime = Math.round(player.getDuration() / 1000); 101. String str = String.format("%02d:%02d", totalTime / 60, 102. totalTime % 60);
103. tv2.setText(str);
104. mSeekBar.setMax(player.getDuration());
105. mHandler.postDelayed(runnable, 1000);
106. }
107.
108. break;
109. case R.id.pause:
110. if (player.isPlaying()) {
111. player.pause();
112. }
113. break;
114. case R.id.stop:
115. if (player.isPlaying()) {
116. player.reset();
117. initMediaplayer();
118. }
119. break;
120.
121. default:
122. break;
123. }
124. }
125.
126. @Override
127. public void onProgressChanged(SeekBar seekBar, int progress, 128. boolean fromUser) {
129. if (player != null) {
130. player.seekTo(seekBar.getProgress());
131. }
132.
133. }
134.
135. @Override
136. public void onStartTrackingTouch(SeekBar seekBar) {
137. // TODO ⾃动⽣成的⽅法存根
138.
139. }
140.
141. @Override
142. public void onStopTrackingTouch(SeekBar seekBar) {
143. // TODO ⾃动⽣成的⽅法存根
144. }
145.
146. @Override
147. protected void onDestroy() {
148. // TODO ⾃动⽣成的⽅法存根
149. super.onDestroy();
150. if (player != null) {
151. player.stop();
152. hadDestroy = true;
153. player.release();
154. }
155. }
156.
157. }
⼆、播放视频⽂件
播放视频⽂件相⽐播放⾳频⽂件并不⽐它复杂,这⾥使⽤VideoView类来实现。

这个类将视频的显⽰和控制集于⼀⾝。

VideoView和MediaPlaer也⽐较类似,主要有以下常⽤⽅法
⽅法名功能描述
setVideoPath()设置要播放的视频⽂件的位置。

start()开始或继续播放视频。

pause()暂停播放视频。

resume()将视频重头开始播放。

seekTo()从指定的位置开始播放视频。

isPlaying()判断当前是否正在播放视频。

getDuration()获取载⼊的视频⽂件的时长。

因为VideoView是包装过的MediaPlayer,所以使⽤起来很相似。

⽐如:
[java]
1. private void initVideoPlayer() {
2. File file = new File(Environment.getExternalStorageDirectory()
3. + "/Download/", "Sample.3gp");
4. videoPlayer.setVideoPath(file.getPath());// 指定视频⽂件的路径
5.
6. }
事件处理
[java]
1. @Override
2. public void onClick(View v) {
3. switch (v.getId()) {
4. case R.id.play:
5. if (!videoPlayer.isPlaying()) {
6. videoPlayer.start();
7. }
8. break;
9. case R.id.pause:
10. if (videoPlayer.isPlaying()) {
11. videoPlayer.pause();
12. }
13. break;
14. case R.id.stop:
15. if (videoPlayer.isPlaying()) {
16. videoPlayer.resume();
17. }
18. break;
19.
20. default:
21. break;
22. }
23. }
三、常见的MediaPlayer错误
也就是它的错误状态。

⽐如这样的错误 start called in state 0,0表⽰他的错误状态,下⾯是MediaPlayer的状态,源码中找到的:[java]
1. enum media_player_states {
2. MEDIA_PLAYER_STATE_ERROR = 0, // 0状态
3. MEDIA_PLAYER_IDLE = 1 << 0, // 1状态
4. MEDIA_PLAYER_INITIALIZED = 1 << 1, // 2 状态
5. MEDIA_PLAYER_PREPARING = 1 << 2, // 4 状态
6. MEDIA_PLAYER_PREPARED = 1 << 3, // 8状态
7. MEDIA_PLAYER_STARTED = 1 << 4, // 16状态
8. MEDIA_PLAYER_PAUSED = 1 << 5, // 32状态
9. MEDIA_PLAYER_STOPPED = 1 << 6, // 64 状态
10. MEDIA_PLAYER_PLAYBACK_COMPLETE = 1 << 7, // 128 状态
11. }
可以参照报错的状态和MediaPlayer的⽣命周期(上图)进⾏错误分析。

相关文档
最新文档