Marty Miller
Marty Miller

Reputation: 1081

Android: MediaPlayer crashes after 3 seconds

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

Answers (1)

Nima
Nima

Reputation: 6573

Try to implement the method onControllerHide() and see what happens.

Upvotes: 3

Related Questions