界面布局代码:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<SurfaceView
android:layout_width="match_parent"
android:layout_height="400dp"
android:id="@+id/surfaceView"
android:layout_above="@+id/btn_start"
android:layout_alignParentTop="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start"
android:id="@+id/btn_start"
android:layout_gravity="bottom"
android:layout_alignParentBottom="true"
android:layout_alignParentStart="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Stop"
android:id="@+id/btn_stop"
android:layout_gravity="right|bottom"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Pause"
android:id="@+id/btn_pause"
android:layout_gravity="center_horizontal|bottom"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
Activity代码和解释如下:
public class MediaPlayerAndSurfaceViewActivity extends Activity implements View.OnClickListener{
SurfaceView surfaceView;
Button startBtn,pauseBtn,stopBtn;
MediaPlayer mediaPlayer;
int position;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mediaplayer_surfaceview);
startBtn = (Button) findViewById(R.id.btn_start);
pauseBtn = (Button) findViewById(R.id.btn_pause);
stopBtn = (Button) findViewById(R.id.btn_stop);
startBtn.setOnClickListener(this);
pauseBtn.setOnClickListener(this);
stopBtn.setOnClickListener(this);
mediaPlayer = new MediaPlayer();
surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
// 设置播放时打开屏幕
surfaceView.getHolder().setKeepScreenOn(true);
// 为SurfaceView添加监听
surfaceView.getHolder().addCallback(new SurfaceListener());
}
private void play(){
mediaPlayer.reset();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
// MediaPlayer设播放的资源
mediaPlayer.setDataSource("/storage/sdcard1/相机/录像/video_20130406_075740.3gp");
// 将视频画面输出到SurfaceView
mediaPlayer.setDisplay(surfaceView.getHolder());
mediaPlayer.prepare();
// 以下两句是 To access the DisplayMetrics members
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
// 设置视频保持纵横比缩放到占满屏幕
surfaceView.setLayoutParams(new RelativeLayout.LayoutParams(metrics.widthPixels
,mediaPlayer.getVideoHeight() * metrics.widthPixels
/mediaPlayer.getVideoWidth()));
mediaPlayer.start();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onClick(View v) {
switch (v.getId())
{
case R.id.btn_start:
play();
break;
case R.id.btn_pause:
if(mediaPlayer.isPlaying()){
mediaPlayer.pause();
}else{
mediaPlayer.start();
}
break;
case R.id.btn_stop:
if(mediaPlayer.isPlaying())
mediaPlayer.stop();
break;
}
}
private class SurfaceListener implements SurfaceHolder.Callback{
@Override
public void surfaceCreated(SurfaceHolder holder) {
if(position > 0){
play();
// 从指定位置播放
mediaPlayer.seekTo(position);
position = 0;
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}
//当跳到其他页面时,保存当前的播放位置
@Override
protected void onPause() {
super.onPause();
if(mediaPlayer.isPlaying()){
position = mediaPlayer.getCurrentPosition();
mediaPlayer.stop();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if(mediaPlayer.isPlaying()) mediaPlayer.stop();
// 释放MediaPlayer所占资源
mediaPlayer.release();
}
}
权限:
<
uses-permission
android
:name=
"android.permission.READ_EXTERNAL_STORAGE"
/>
注:这种方式播放视频真麻烦,不推荐使用,推荐使用VedioView和MediaController结合的方式播放视频