package per.juan.playvideodome;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.media.MediaPlayer;
import android.os.Build;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.WindowManager;
public class MainActivity extends AppCompatActivity {
SurfaceView mSvVideoPlayer;
private MediaPlayer mMediaPlayer;
private int mPosition = 0;
private boolean hasActiveHolder = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSvVideoPlayer = findViewById(R.id.sv_video_player);
playVideo();
}
/**
* 播放視頻
*/
public void playVideo() {
if (mMediaPlayer == null) {
//實體化MediaPlayer物件
mMediaPlayer = new MediaPlayer();
mSvVideoPlayer.setVisibility(View.VISIBLE);
boolean mHardwareDecoder = false;
// 不維持自身緩沖區,直接顯示
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB && mHardwareDecoder) {
mSvVideoPlayer.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
mSvVideoPlayer.getHolder().setFixedSize(getScreenWidth(), getScreenHeight());
mSvVideoPlayer.getHolder().setKeepScreenOn(true);//保持螢屏常亮
mSvVideoPlayer.getHolder().addCallback(new SurFaceCallback());
}
}
/**
* 向player中設定dispay,也就是SurfaceHolder。但此時有可能SurfaceView還沒有創建成功,所以需要監聽SurfaceView的創建事件
*/
private final class SurFaceCallback implements SurfaceHolder.Callback {
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
if (mMediaPlayer == null) {
return;
}
if (!hasActiveHolder) {
play(mPosition);
hasActiveHolder = true;
}
if (mPosition > 0) {
play(mPosition);
mPosition = 0;
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (mMediaPlayer == null) {
return;
}
if (mMediaPlayer.isPlaying()) {
mMediaPlayer.stop();
mPosition = mMediaPlayer.getCurrentPosition();
}
}
private void play(int position) {
try {
//添加播放視頻的路徑與配置MediaPlayer
AssetFileDescriptor fileDescriptor = getResources().openRawResourceFd(R.raw.info);
mMediaPlayer.reset();
//給mMediaPlayer添加預覽的SurfaceHolder,將播放器和SurfaceView關聯起來
mMediaPlayer.setDisplay(mSvVideoPlayer.getHolder());
mMediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),
fileDescriptor.getStartOffset(),
fileDescriptor.getLength());
// 緩沖
mMediaPlayer.prepare();
mMediaPlayer.setOnBufferingUpdateListener(new BufferingUpdateListener());
mMediaPlayer.setOnPreparedListener(new PreparedListener(position));
mMediaPlayer.setOnCompletionListener(new CompletionListener());
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 緩沖變化時回呼
*/
private final class BufferingUpdateListener implements MediaPlayer.OnBufferingUpdateListener {
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
}
}
/**
* 準備完成回呼
* 只有當播放器準備好了之后才能夠播放,所以播放的出發只能在觸發了prepare之后
*/
private final class PreparedListener implements MediaPlayer.OnPreparedListener {
private int position;
public PreparedListener(int position) {
this.position = position;
}
@Override
public void onPrepared(MediaPlayer mp) {
mMediaPlayer.start();
if (position > 0) {
mMediaPlayer.seekTo(position);
}
}
}
/**
* 播放結束時回呼
*/
private final class CompletionListener implements MediaPlayer.OnCompletionListener {
@Override
public void onCompletion(MediaPlayer mp) {
mMediaPlayer.start();
}
}
@Override
public void onDestroy() {
//釋放記憶體,MediaPlayer底層是運行C++的函式方法,不使用后必需釋放記憶體
if (mMediaPlayer != null) {
if (mMediaPlayer.isPlaying()) {
mMediaPlayer.pause();
mPosition = mMediaPlayer.getCurrentPosition();
}
mMediaPlayer.release();
mMediaPlayer = null;
}
super.onDestroy();
}
private int getScreenWidth() {
return ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getWidth();
}
private int getScreenHeight() {
return ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay()
.getHeight();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/72514.html
標籤:Android
下一篇:跪求一個it大神
