iStar
iStar

Reputation: 1120

How to refresh SurfaceView when Activity onResume?

I play a rtsp video stream using MediaPlayer and display it in a SurfaceView. I do MediaPlayer initial works in Activity.onResume() and release it in Activity.onPause(). It works fine when jump to a normal Activity(called onPause) then return back(called onResume).

The problem is, while video is playing, jump to a dialog-like Activity and return back, the video cannot be refreshed(video frame is frozen) but audio was fine. What can I do to play video stream normally in this situation? How to refresh the SurfaceView?

Thank you all.

ps: As description above, normal Activity is an Activity that fill up the whole window, and dialog-like Activity is an Activity that looks like a AlertDialog, usually an Activity with android:theme="@android:style/Theme.Dialog" theme, just like GoogleVoice app. When this kind of Activity is foreground, we can see part of the background Activity.

EDIT: My code is a little bit complex, and I paste the key snippet:

@Override
protected void onCreate(Bundle savedInstanceState) {
    //....
    mPreview = (SurfaceView) this.findViewById(R.id.playerView);
    mHolder = mPreview.getHolder();
    mHolder.addCallback(this);
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

@Override
protected void onResume() {
    mPath = "rtsp://10.10.20.42/Viral.mp4";
    // Create a new media player and set the listeners
    mMediaPlayer = new MediaPlayer();
    mMediaPlayer.setDataSource(mPath);
    // mMediaPlayer.setDisplay(holder);
    mMediaPlayer.setScreenOnWhilePlaying(true);
    mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    mMediaPlayer.prepareAsync();
    mMediaPlayer.setOnBufferingUpdateListener(this);
    mMediaPlayer.setOnCompletionListener(this);
    mMediaPlayer.setOnPreparedListener(this);
    mMediaPlayer.setOnVideoSizeChangedListener(this);
    mMediaPlayer.setOnErrorListener(this);

    super.onResume();
}

@Override
protected void onPause() {
    if (mMediaPlayer != null) {

        mMediaPlayer.release();
        mMediaPlayer = null;
    }
    super.onPause();
}

Upvotes: 3

Views: 7605

Answers (1)

iStar
iStar

Reputation: 1120

Well, I finally solved this problem. I did not re set the SurfaceHolder of MediaPlayer(call mMediaPlayer.setDisplay(SurfaceHolder holder)).

Here is my code:

@Override
protected void onResume() {
    mPath = "rtsp://10.10.20.42/Viral.mp4";
    // Create a new media player and set the listeners
    mMediaPlayer = new MediaPlayer();
    mMediaPlayer.setDataSource(mPath);
    // mMediaPlayer.setDisplay(holder);
    mMediaPlayer.setScreenOnWhilePlaying(true);
    mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    mMediaPlayer.prepareAsync();
    mMediaPlayer.setOnBufferingUpdateListener(this);
    mMediaPlayer.setOnCompletionListener(this);
    mMediaPlayer.setOnPreparedListener(this);
    mMediaPlayer.setOnVideoSizeChangedListener(this);
    mMediaPlayer.setOnErrorListener(this);

    if (mHolder != null) {
        mMediaPlayer.setDisplay(mHolder);
    }
    super.onResume();
}

@Override
public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) {
    Log.d(TAG, "surfaceChanged called");
    this.mHolder = surfaceholder;
    if (mMediaPlayer != null) {
        mMediaPlayer.setDisplay(surfaceholder);
    }
}

Upvotes: 2

Related Questions