Fixed bugs in the media player api demo application
- release the MediaPlayer object when onPause - use onVideoSizeChanged listener to make sure that correct video size is known before starting playback
This commit is contained in:
@@ -9,6 +9,8 @@ import android.media.AudioManager;
|
||||
import android.media.MediaPlayer;
|
||||
import android.media.MediaPlayer.OnBufferingUpdateListener;
|
||||
import android.media.MediaPlayer.OnCompletionListener;
|
||||
import android.media.MediaPlayer.OnPreparedListener;
|
||||
import android.media.MediaPlayer.OnVideoSizeChangedListener;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.SurfaceHolder;
|
||||
@@ -21,7 +23,7 @@ import android.widget.Toast;
|
||||
|
||||
public class MediaPlayerDemo_Video extends Activity implements
|
||||
OnBufferingUpdateListener, OnCompletionListener,
|
||||
MediaPlayer.OnPreparedListener, SurfaceHolder.Callback {
|
||||
OnPreparedListener, OnVideoSizeChangedListener, SurfaceHolder.Callback {
|
||||
|
||||
private static final String TAG = "MediaPlayerDemo";
|
||||
private int mVideoWidth;
|
||||
@@ -37,6 +39,8 @@ public class MediaPlayerDemo_Video extends Activity implements
|
||||
private static final int RESOURCES_AUDIO = 3;
|
||||
private static final int LOCAL_VIDEO = 4;
|
||||
private static final int STREAM_VIDEO = 5;
|
||||
private boolean mIsVideoSizeKnown = false;
|
||||
private boolean mIsVideoReadyToBePlayed = false;
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -54,6 +58,7 @@ public class MediaPlayerDemo_Video extends Activity implements
|
||||
}
|
||||
|
||||
private void playVideo(Integer Media) {
|
||||
doCleanUp();
|
||||
try {
|
||||
|
||||
switch (Media) {
|
||||
@@ -109,6 +114,7 @@ public class MediaPlayerDemo_Video extends Activity implements
|
||||
mMediaPlayer.setOnBufferingUpdateListener(this);
|
||||
mMediaPlayer.setOnCompletionListener(this);
|
||||
mMediaPlayer.setOnPreparedListener(this);
|
||||
mMediaPlayer.setOnVideoSizeChangedListener(this);
|
||||
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
|
||||
|
||||
|
||||
@@ -126,15 +132,26 @@ public class MediaPlayerDemo_Video extends Activity implements
|
||||
Log.d(TAG, "onCompletion called");
|
||||
}
|
||||
|
||||
public void onPrepared(MediaPlayer mediaplayer) {
|
||||
Log.d(TAG, "onPrepared called");
|
||||
mVideoWidth = mMediaPlayer.getVideoWidth();
|
||||
mVideoHeight = mMediaPlayer.getVideoHeight();
|
||||
if (mVideoWidth != 0 && mVideoHeight != 0) {
|
||||
holder.setFixedSize(mVideoWidth, mVideoHeight);
|
||||
mMediaPlayer.start();
|
||||
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) {
|
||||
@@ -148,22 +165,43 @@ public class MediaPlayerDemo_Video extends Activity implements
|
||||
|
||||
|
||||
public void surfaceCreated(SurfaceHolder holder) {
|
||||
// TODO Auto-generated method stub
|
||||
Log.d(TAG, "surfaceCreated called");
|
||||
playVideo(extras.getInt(MEDIA));
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
releaseMediaPlayer();
|
||||
doCleanUp();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
// TODO Auto-generated method stub
|
||||
releaseMediaPlayer();
|
||||
doCleanUp();
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user