代码改变世界

Android系列之MediaPlayer 多媒体播放器

2010-11-14 13:01  $等待$  阅读(2529)  评论(1编辑  收藏  举报
MediaPlayer 可以播放音频和视频,另外也可以通过VideoView来播放视频,虽然VideoView比MediaPlayer简单易用,但定制性不如用 MediaPlayer,要视情况选择了。MediaPlayer播放音频比较简单,但是要播放视频就需要SurfaceView。 SurfaceView比普通的自定义View更有绘图上的优势,它支持完全的OpenGL ES库。

先看看效果吧!

 

main.xml
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>
29  

 

TestMedia.java
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 }
167