原文:https://blog.csdn.net/uyy203/article/details/72460564
MianActivity.java
package xyz.video;
import android.app.Activity;
import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
public class MainActivity extends Activity {
private MediaPlayer mp = new MediaPlayer();
private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
private int currentIndex = 0; //播放进度
private boolean isSurfaceCreated=false;//surface是否已创建
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
mp = new MediaPlayer();
createSurface();
mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.seekTo(currentIndex);
mp.start();
}
});
//播放完成时
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
releasePlayer();
// surfaceView.setVisibility(View.GONE);
}
});
}
private SurfaceHolder.Callback mCallback = new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
// 当Surface被创建时触发
if (surfaceHolder == null) return;
isSurfaceCreated=true;
play();
Log.e("surface", "created");
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
// 当Surface尺寸等参数改变时触发
Log.e("surface", "changed");
}
@Override
public void surfaceDestroyed(SurfaceHolder Holder) {
// 当Surface被销毁时触发
Log.e("surface", "Destroyed");
isSurfaceCreated=false;
surfaceHolder=null;
}
};
//创建surface
private void createSurface(){
if(mp==null) return;
surfaceHolder = surfaceView.getHolder();
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); //兼容4.0以下的版本
surfaceHolder.addCallback(mCallback);
}
//释放mediaplayer
private void releasePlayer(){
if(mp!=null){
mp.stop();
mp.release();
mp=null;
surfaceView.setVisibility(View.GONE);
}
}
//播放
private void play(){
if(mp==null) return;
try {
/**raw目录**/
mp.reset();
// //在这里我们指定MediaPlayer在当前的Surface中进行播放
// Uri uri=Uri.parse("android.resource://"+getPackageName()+"/"+R.raw.welcome_video_720_1280);
// mp.setDisplay(surfaceHolder);
// mp.setDataSource(getBaseContext(),uri);
// //在指定了MediaPlayer播放的容器后,我们就可以使用prepare或者prepareAsync来准备播放了
// mp.prepareAsync();
/**assets目录**/
mp.reset();
AssetManager assetManager = getAssets();
// 取得音频文件
AssetFileDescriptor descriptor = assetManager.openFd("welcome_video_720_1280.mp4");
// 加载音频,但还未完全准备
mp.setDisplay(surfaceHolder);
mp.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength());
mp.prepareAsync();
}catch (Exception e){
e.printStackTrace();
}
}
@Override
protected void onPause() {
super.onPause();
try {
//假如正在播放,程序因进入后台等原因进入onPause,记录当前播放进度
if (mp != null && mp.isPlaying()) {
currentIndex = mp.getCurrentPosition();
mp.pause();
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e("activity", "destroy");
releasePlayer();//释放MediaPlayer
}
@Override
protected void onRestart() {
super.onRestart();
//重新进入app,假如surface还没被创建,再次创建
if(!isSurfaceCreated) {
createSurface();
}
}
@Override
protected void onResume() {
super.onResume();
//重新进入App后,在暂停的位置开始播放
if(isSurfaceCreated) {
play();
}
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="xyz.video.MainActivity">
<SurfaceView
android:id="@+id/surfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>