MediaPlayer 可以播放音频和视频,另外也可以通过VideoView来播放视频,虽然VideoView比MediaPlayer简单易用,但定制性不如用 MediaPlayer,要视情况选择了。MediaPlayer播放音频比较简单,但是要播放视频就需要SurfaceView。 SurfaceView比普通的自定义View更有绘图上的优势,它支持完全的OpenGL ES库。
代码片段(3)
[图片] 程序截图
[代码] 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 |