MediaPlayer 可以播放音频和视频,另外也可以通过VideoView来播放视频,虽然VideoView比MediaPlayer简单易用,但定制性不如用 MediaPlayer,要视情况选择了。MediaPlayer播放音频比较简单,但是要播放视频就需要SurfaceView。 SurfaceView比普通的自定义View更有绘图上的优势,它支持完全的OpenGL ES库。
布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<SeekBar
android:id="@+id/seb1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btn_audio_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="播放音频"
/>
<Button
android:id="@+id/btn_audio_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止播放"
/>
</LinearLayout>
<SurfaceView
android:id="@+id/suf"
android:layout_width="match_parent"
android:layout_height="200dp"
/>
<SeekBar
android:id="@+id/seb2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btn_video_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="播放视频"
/>
<Button
android:id="@+id/btn_video_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止播放"
/>
</LinearLayout>
</LinearLayout>
主Activity:
package com.example.testmediaplayer2;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.Toast;
public class MediaActivity extends Activity implements OnClickListener{
private SeekBar mSekAudio;
private Button mBtnStartAudio;
private Button mBtnStopAudio;
private SeekBar mSekVidio;
private Button mBtnStartVidio;
private Button mBtnStopVidio;
private SurfaceView mSurView;
private SurfaceHolder mSurViewHolder;
private MediaPlayer mPlayer;
private boolean isChange = false; //互斥变量,防止定时器与SeekBar拖动时进度冲突
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSekAudio = (SeekBar) findViewById(R.id.seb1);
mBtnStartAudio = (Button) findViewById(R.id.btn_audio_start);
mBtnStopAudio = (Button) findViewById(R.id.btn_audio_stop);
mSekVidio = (SeekBar) findViewById(R.id.seb2);
mBtnStartVidio = (Button) findViewById(R.id.btn_video_start);
mBtnStopVidio = (Button) findViewById(R.id.btn_video_stop);
mSurView = (SurfaceView) findViewById(R.id.suf);
mSurViewHolder = mSurView.getHolder();
mSurViewHolder.setFixedSize(200, 200);
mSurViewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mSurViewHolde.setKeepScreenOn(true) //避免锁屏
//----------Media控件设置---------//
mPlayer = new MediaPlayer();
//播放结束之后弹出提示
/*mPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
Toast.makeText(MediaActivity.this, "play over", Toast.LENGTH_SHORT).show();
mPlayer.release();//释放
}
});*/
mBtnStartAudio.setOnClickListener(this);
mBtnStopAudio.setOnClickListener(this);
mBtnStartVidio.setOnClickListener(this);
mBtnStopVidio.setOnClickListener(this);
mSekAudio.setOnSeekBarChangeListener(new OnSeekBarChangeEvent());
mSekAudio.setOnSeekBarChangeListener(new OnSeekBarChangeEvent());
//----------定时器记录播放进度---------//
Timer timer = new Timer();
TimerTask task = new TimerTask(){
@Override
public void run() {
// TODO Auto-generated method stub
if(isChange){
return;
}
if(mPlayer.getVideoHeight() == 0){
mSekAudio.setProgress(mPlayer.getCurrentPosition());
}else{
mSekVidio.setProgress(mPlayer.getCurrentPosition());
}
}
};
timer.schedule(task,0,10);
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
mPlayer.release();
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.btn_audio_start:
{
mPlayer.reset(); //恢复到未初始化的状态 ,MediaPlayer从error状态到idle状态
mPlayer = MediaPlayer.create(MediaActivity.this,R.raw.a );
try {
mPlayer.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mSekAudio.setMax(mPlayer.getDuration());
mPlayer.start();
}
break;
case R.id.btn_audio_stop:
{
if(mPlayer != null){
mPlayer.stop();
}
}
break;
case R.id.btn_video_start:
{
mPlayer.reset();
mPlayer = MediaPlayer.create(MediaActivity.this,R.raw.b);
mPlayer.setDisplay(mSurViewHolder); //设置屏幕
mSekVidio.setMax(mPlayer.getDuration());
try {
mPlayer.prepare(); //准备,同步调用
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mSekAudio.setMax(mPlayer.getDuration());
mPlayer.start();
}
break;
case R.id.btn_video_stop:
{
if(mPlayer != null){
mPlayer.stop();
}
}
break;
default:
break;
}
}
class OnSeekBarChangeEvent implements SeekBar.OnSeekBarChangeListener{
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
mPlayer.seekTo(seekBar.getProgress());
isChange = false;
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
isChange = true;
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub
}
};
}
/********************************MediaPlayer的使用***************************************/
Android MediaPlayer使用方法简单介绍
m_mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(), fileDescriptor.getLength());
seekTo()是定位方法,可以让播放器从指定的位置开始播放,需要注意的是该方法是个异步方法,也就是说该方法返回时并不意味着定位完成,尤其是播放的网络文件,真正定位完成时会触发OnSeekComplete.onSeekComplete(),如果需要是可以调用setOnSeekCompleteListener(OnSeekCompleteListener)设置监听器来处理的。