Android 的 MediaPlayer 多媒体播放器

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

 

片] 程序截图

[代码] main.xml

01 <?xml version="1.0" encoding="utf-8"?>
02 <LinearLayout android:id="@+id/LinearLayout01"
03 android:layout_width="fill_parent" android:layout_height="fill_parent"
04 xmlns:android="http://schemas.android.com/apk/res/android"
05 android:orientation="vertical">
06 <SeekBar android:id="@+id/SeekBar01" android:layout_height="wrap_content"
07 android:layout_width="fill_parent"></SeekBar>
08 <LinearLayout android:id="@+id/LinearLayout02"
09 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>

[代码] TestMedia.java

001 package com.testMedia;
002
003 import java.io.IOException;
004 import java.util.Timer;
005 import java.util.TimerTask;
006 import android.app.Activity;
007 import android.media.AudioManager;
008 import android.media.MediaPlayer;
009 import android.os.Bundle;
010 import android.view.SurfaceHolder;
011 import android.view.SurfaceView;
012 import android.view.View;
013 import android.widget.Button;
014 import android.widget.SeekBar;
015 import android.widget.Toast;
016
017
018 public class TestMedia extends Activity {
019 /** Called when the activity is first created. */
020
021 private SeekBar skb_audio=null;
022 private Button btn_start_audio = null;
023 private Button btn_stop_audio = null;
024
025 private SeekBar skb_video=null;
026 private Button btn_start_video = null;
027 private Button btn_stop_video = null;
028 private SurfaceView surfaceView;
029 private SurfaceHolder surfaceHolder;
030
031 private MediaPlayer m = null;
032 private Timer mTimer;
033 private TimerTask mTimerTask;
034
035 private boolean isChanging=false;//互斥变量,防止定时器与SeekBar拖动时进度冲突
036 @Override
037 public void onCreate(Bundle savedInstanceState) {
038 super.onCreate(savedInstanceState);
039 setContentView(R.layout.main);
040
041 //----------Media控件设置---------//
042 m=new MediaPlayer();
043
044 //播放结束之后弹出提示
045 m.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){
046 @Override
047 public void onCompletion(MediaPlayer arg0) {
048 Toast.makeText(testMedia.this, "结束", 1000).show();
049 m.release();
050 }
051 });
052
053 //----------定时器记录播放进度---------//
054 mTimer = new Timer();
055 mTimerTask = new TimerTask() {
056 @Override
057 public void run() {
058 if(isChanging==true)
059 return;
060
061 if(m.getVideoHeight()==0)
062 skb_audio.setProgress(m.getCurrentPosition());
063 else
064 skb_video.setProgress(m.getCurrentPosition());
065 }
066 };
067
068 mTimer.schedule(mTimerTask, 0, 10);
069
070 btn_start_audio = (Button) this.findViewById(R.id.Button01);
071 btn_stop_audio = (Button) this.findViewById(R.id.Button02);
072 btn_start_audio.setOnClickListener(new ClickEvent());
073 btn_stop_audio.setOnClickListener(new ClickEvent());
074 skb_audio=(SeekBar)this.findViewById(R.id.SeekBar01);
075 skb_audio.setOnSeekBarChangeListener(new SeekBarChangeEvent());
076
077 btn_start_video = (Button) this.findViewById(R.id.Button03);
078 btn_stop_video = (Button) this.findViewById(R.id.Button04);
079 btn_start_video.setOnClickListener(new ClickEvent());
080 btn_stop_video.setOnClickListener(new ClickEvent());
081 skb_video=(SeekBar)this.findViewById(R.id.SeekBar02);
082 skb_video.setOnSeekBarChangeListener(new SeekBarChangeEvent());
083 surfaceView = (SurfaceView) findViewById(R.id.SurfaceView01);
084 surfaceHolder = surfaceView.getHolder();
085 surfaceHolder.setFixedSize(100, 100);
086 surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
087 }
088
089 /**
090 * 按键事件处理
091 */
092 class ClickEvent implements View.OnClickListener{
093 @Override
094 public void onClick(View v) {
095 if(v==btn_start_audio)
096 {
097 m.reset();//恢复到未初始化的状态
098 m=MediaPlayer.create(testMedia.this, R.raw.big);//读取音频
099 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 }

 

posted @ 2012-04-24 23:29  周文  阅读(383)  评论(0编辑  收藏  举报