Reputation: 1081
i'm trying to play a video with MediaPlayer and MediaController. The video starts and after three seconds, it crashes. I believe this is because the video controls hide three seconds after the video starts. The exception says something like "abstracted method not implemented View.onControllerHide() etc. I've implemented all the classes I'm supposed to and I can't find any reference to a method called onControllerHide(). Anything will help. See code below (I left out the irrelevant code to make it easier to read). Thanks!
public class LessonView extends Activity implements OnTouchListener, OnPreparedListener, SurfaceHolder.Callback,
MediaController.MediaPlayerControl, OnVideoSizeChangedListener, OnCompletionListener, OnBufferingUpdateListener {
private static final String TAG = "LessonView";
private MediaPlayer mMediaPlayer;
private MediaController mMediaController;
private Handler handler;
private SurfaceView mPreview;
private SurfaceHolder holder;
private String uri;
private int mVideoWidth = 0;
private int mVideoHeight = 0;
private boolean mIsVideoReadyToBePlayed, mIsVideoSizeKnown;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// remove status bar
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.lessonview);
ImageView backTabImg = (ImageView) findViewById(R.id.backTabImageView);
backTabImg.setOnTouchListener(this);
mPreview.setOnTouchListener(this);
holder = mPreview.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
uri = Globals.currentLesson.getDownloadURL();
handler = new Handler();
changeBackground();
}
private void playVideo() {
Log.v(TAG, "playVideo");
// Create a new media player and set the listeners
doCleanUp();
try {
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(uri);
mMediaPlayer.setDisplay(holder);
mMediaPlayer.prepare();
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.setOnBufferingUpdateListener(this);
mMediaPlayer.setOnCompletionListener(this);
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.setScreenOnWhilePlaying(true);
mMediaPlayer.setOnVideoSizeChangedListener(this);
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaController = new MediaController(this);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public boolean onTouch(View v, MotionEvent event) {
Log.v(TAG, "onTouch");
int position = v.getId();
if(position == R.id.backTabImageView) {
finish();
return true;
}
if(position == R.id.lessonSurfaceView) {
Log.v(TAG, "touch event");
mMediaController.show();
return true;
}
return false;
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.v(TAG, "onSurfaceCreated");
playVideo();
}
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();
}
}
@Override
public void onPrepared(MediaPlayer mp) {
Log.v(TAG, "onPrepared called");
mIsVideoReadyToBePlayed = true;
if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
startVideoPlayback();
}
mMediaController.setMediaPlayer(this);
mMediaController.setAnchorView(findViewById(R.id.lessonSurfaceView));
handler.post(new Runnable() {
public void run() {
mMediaController.setEnabled(true);
mMediaController.show();
}});
}
private void startVideoPlayback() {
Log.v(TAG, "startVideoPlayback");
holder.setFixedSize(mVideoWidth, mVideoHeight);
mMediaPlayer.start();
}
Upvotes: 0
Views: 560