package com.guo.duoduo.airplayreceiver.ui; import java.lang.ref.WeakReference; import java.util.Timer; import java.util.TimerTask; import android.app.Activity; import android.content.Intent; import android.graphics.PixelFormat; import android.media.AudioManager; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import com.guo.duoduo.airplayreceiver.MyController; import com.guo.duoduo.airplayreceiver.R; import com.guo.duoduo.airplayreceiver.constant.Constant; import io.vov.vitamio.LibsChecker; import io.vov.vitamio.MediaPlayer; import io.vov.vitamio.MediaPlayer.OnBufferingUpdateListener; import io.vov.vitamio.widget.VideoView; /** * Created by Guo.Duo duo on 2015/8/25. */ public class VideoPlayerActivity_MediaPlayer extends Activity implements OnBufferingUpdateListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnVideoSizeChangedListener, SurfaceHolder.Callback { private static final String tag = "VideoPlayerActivity"; private static volatile long duration = 0; private static volatile long curPosition = 0; private static volatile boolean isVideoActivityFinished = false; private int mVideoWidth; private int mVideoHeight; private MediaPlayer mMediaPlayer; private SurfaceView mPreview; private SurfaceHolder holder; private String mPath; private double position; private boolean mIsVideoSizeKnown = false; private boolean mIsVideoReadyToBePlayed = false; private Handler handler; private MyController controller; private Timer timer; private TimerTask timerTask; public static boolean isVideoActivityFinished() { return isVideoActivityFinished; } public static long getDuration() { return duration; } public static long getCurrentPosition() { return curPosition; } /** * * Called when the activity is first created. */ @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); isVideoActivityFinished = false; if (!LibsChecker.checkVitamioLibs(this)) return; setContentView(R.layout.activity_video_mediaplayer); handler = new VideoHandler(this); controller = new MyController(VideoPlayerActivity.class.getName(), handler); mPreview = (SurfaceView) findViewById(R.id.surface); holder = mPreview.getHolder(); holder.addCallback(this); holder.setFormat(PixelFormat.RGBA_8888); timer = new Timer(); timerTask = new TimerTask() { @Override public void run() { if (mMediaPlayer != null && mMediaPlayer.isPlaying()) { duration = mMediaPlayer.getDuration(); } else duration = 0; if (mMediaPlayer != null && mMediaPlayer.isPlaying()) curPosition = mMediaPlayer.getCurrentPosition(); else curPosition = 0; } }; timer.scheduleAtFixedRate(timerTask, 0, 1 * 1000); } private void playVideo() { doCleanUp(); try { Intent intent = getIntent(); if (intent == null) { return; } mPath = intent.getStringExtra("path"); position = intent.getDoubleExtra("position", 0); Log.d(tag, "airplay path = " + mPath + "; position = " + position); // Create a new media player and set the listeners mMediaPlayer = new MediaPlayer(this); mMediaPlayer.setDataSource(mPath); mMediaPlayer.setDisplay(holder); mMediaPlayer.prepare(); mMediaPlayer.setOnBufferingUpdateListener(this); mMediaPlayer.setOnCompletionListener(this); mMediaPlayer.setOnPreparedListener(this); mMediaPlayer.setOnVideoSizeChangedListener(this); setVolumeControlStream(AudioManager.STREAM_MUSIC); } catch (Exception e) { Log.e(tag, "error: " + e.getMessage(), e); } } public void onBufferingUpdate(MediaPlayer arg0, int percent) { Log.d(tag, "onBufferingUpdate percent:" + percent); } public void onCompletion(MediaPlayer arg0) { Log.d(tag, "onCompletion called"); } public void onVideoSizeChanged(MediaPlayer mp, int width, int height) { Log.v(tag, "onVideoSizeChanged called"); if (width == 0 || height == 0) { Log.e(tag, "invalid video width(" + width + ") or height(" + height + ")"); return; } mIsVideoSizeKnown = true; mVideoWidth = width; mVideoHeight = height; if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) { startVideoPlayback(); } } public void onPrepared(MediaPlayer mediaplayer) { Log.d(tag, "onPrepared called"); mIsVideoReadyToBePlayed = true; if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) { startVideoPlayback(); } } public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) { Log.d(tag, "surfaceChanged called"); } public void surfaceDestroyed(SurfaceHolder surfaceholder) { Log.d(tag, "surfaceDestroyed called"); } public void surfaceCreated(SurfaceHolder holder) { Log.d(tag, "surfaceCreated called"); playVideo(); } @Override protected void onPause() { super.onPause(); isVideoActivityFinished = true; releaseMediaPlayer(); doCleanUp(); } @Override protected void onDestroy() { super.onDestroy(); Log.d(tag, "airplay VideoPlayerActivity onDestroy"); releaseMediaPlayer(); doCleanUp(); if (controller != null) controller.destroy(); if (timerTask != null) { timerTask.cancel(); timerTask = null; } if (timer != null) { timer.cancel(); timer = null; } } private void releaseMediaPlayer() { if (mMediaPlayer != null) { mMediaPlayer.release(); mMediaPlayer = null; } } private void doCleanUp() { mVideoWidth = 0; mVideoHeight = 0; mIsVideoReadyToBePlayed = false; mIsVideoSizeKnown = false; } private void startVideoPlayback() { Log.v(tag, "startVideoPlayback"); holder.setFixedSize(mVideoWidth, mVideoHeight); mMediaPlayer.start(); //实现端断点许序播 long pos = (long) (mMediaPlayer.getDuration() * position); mMediaPlayer.seekTo(pos); } private static class VideoHandler extends Handler { private WeakReference<VideoPlayerActivity_MediaPlayer> weakReference; public VideoHandler(VideoPlayerActivity_MediaPlayer activity) { weakReference = new WeakReference<VideoPlayerActivity_MediaPlayer>(activity); } @Override public void handleMessage(Message msg) { super.handleMessage(msg); VideoPlayerActivity_MediaPlayer activity = weakReference.get(); if (activity == null) return; if (activity.isFinishing()) return; switch (msg.what) { case Constant.Msg.Msg_Video_Seek : float posFloat = (float) msg.obj; long pos = Long.valueOf((long) (posFloat * 1000)); Log.d(tag, "airplay seek post = " + pos); activity.mMediaPlayer.seekTo(pos); break; case Constant.Msg.Msg_Stop : activity.mMediaPlayer.stop(); activity.releaseMediaPlayer(); activity.finish(); break; case Constant.Msg.Msg_Video_Pause : if (activity.mMediaPlayer.isPlaying()) activity.mMediaPlayer.pause(); break; case Constant.Msg.Msg_Video_Resume : if (!activity.mMediaPlayer.isPlaying()) activity.mMediaPlayer.start(); break; } } } }