这个小型播放器主要,通过通过SurfaceView/SurfaceHolder实现自己的播放器 ,至于什么是SurfaceView/SurfaceHolder,翻阅android API 中写到:SurfaceView 是“提供一个专门的绘图表面嵌入视图层次。您可以控制这个表面的格式,如果你喜欢,它的大小,SurfaceView负责表面放置在正确的位置在屏幕上.......访问底层表面是通过SurfaceHolder提供的接口,可以通过调用检索getHolder()。"
那我们接下来的步骤是:
1、首先,我们从布局文件中获取一个surfaceView
2、通过surfaceView.getHolder()方法获取与该容器想对应的surfaceHolder
3、对srufaceHolder进行一些默认的设置,如addCallback()和setType()
4、通过mediaPlayer.setDisplay()方法将视频播放与播放容器链接起来 。
代码如下:
public class MainActivity extends Activity {
MediaPlayer mediaPlayer ; // 播放器的内部实现是通过MediaPlayer
SurfaceView surfaceView ;// 装在视频的容器
SurfaceHolder surfaceHolder;// 控制surfaceView的属性(尺寸、格式等)对象
boolean isPause ; // 是否已经暂停了
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
surfaceView = (SurfaceView) findViewById(R.id.surfaceView1);
/**
* 获取与当前surfaceView相关联的那个的surefaceHolder
*/
surfaceHolder = surfaceView.getHolder();
/**
* 注册当surfaceView创建、改变和销毁时应该执行的方法
*/
surfaceHolder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
Log.i("通知", "surfaceHolder被销毁了");
if(mediaPlayer!=null)
mediaPlayer.release();
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.i("通知", "surfaceHolder被create了");
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
Log.i("通知", "surfaceHolder被改变了");
}
});
/**
* 这里必须设置为SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS哦,意思
* 是创建一个push的'surface',主要的特点就是不进行缓冲
*/
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
/***
* @param targetButton 被用户点击的按钮
*/
public void buttonClick(View targetButton){
int buttonId = targetButton.getId();
switch (buttonId) {
case R.id.button_play:
play();
break;
case R.id.button_pause:
pause();
break;
case R.id.button_reset:
reset();
break;
case R.id.button_stop:
stop();
break;
default:
break;
}
}
/**
* 播放
*/
private void play(){
mediaPlayer = MediaPlayer.create(this, R.raw.ccc);
// 设置多媒体流类型
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
// 设置用于展示mediaPlayer的容器
mediaPlayer.setDisplay(surfaceHolder); ///这个句话的重要性
try {
// mediaPlayer.setDataSource("/storage/sdcard/ccc.mp4");
//
// mediaPlayer.prepare();
mediaPlayer.start();
isPause = false;
} catch (Exception e) {
Log.i("通知", "播放过程中出现了错误哦");
Log.i("错误信息",e.toString());
}
}
/**
* 暂停
*/
private void pause(){
Log.i("通知", "点击了暂停按钮");
if(isPause==false){
mediaPlayer.pause();
isPause=true;
}else{
mediaPlayer.start();
isPause=false;
}
}
/**
* 重置
*/
private void reset(){
Log.i("通知", "点击了reset按钮");
// 跳转到视频的最开始
mediaPlayer.seekTo(0);
mediaPlayer.start();
}
/**
* 停止
*/
private void stop(){
Log.i("通知", "点击了stop按钮");
mediaPlayer.stop();
mediaPlayer.release();
}
}
xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical">
<SurfaceView
android:id="@+id/surfaceView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0.6" >
</SurfaceView>
<LinearLayout android:layout_width="fill_parent" android:layout_height="80dp"
android:orientation="horizontal" android:layout_weight="0.2"
>
<ImageButton android:id="@+id/button_play" android:onClick="buttonClick"
android:layout_width="80dp" android:layout_height="80dp">
</ImageButton>
<ImageButton android:id="@+id/button_pause" android:onClick="buttonClick"
android:layout_width="80dp" android:layout_height="80dp">
</ImageButton>
<ImageButton android:id="@+id/button_stop" android:onClick="buttonClick"
android:layout_width="80dp" android:layout_height="80dp">
</ImageButton>
<ImageButton
android:id="@+id/button_reset"
android:layout_width="80dp"
android:layout_height="80dp"
android:onClick="buttonClick" >
</ImageButton>
</LinearLayout>
</LinearLayout>