2013-03-19 60 views
0

我正在開發基於android的應用程序,即播放視頻。當我播放任何視頻時,它會啓動它,然後我按後退按鈕並返回屏幕以選擇另一個播放(停止第一個視頻)(當我選擇第二個視頻時,第一個視頻(已播放))凍結和第二個視頻開始在這第一個視頻背後,我可以聽第二個視頻的音樂等,任何一個可以幫助如何停止和刪除媒體播放器的視頻,以便用戶可以觀看新視頻 這是我的活動Android媒體播放器視頻問題(當我玩第二個時,第一個視頻會被凍結)

public class TrailVideoActivity extends Activity implements 
OnBufferingUpdateListener, OnCompletionListener, 
OnPreparedListener, OnVideoSizeChangedListener, SurfaceHolder.Callback{ 
@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     setVolumeControlStream(AudioManager.STREAM_MUSIC); 
     PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); 
     wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "MyMediaPlayer"); 
     //setContentView(R.layout.main); 

     setContentView(LayoutInflater.from(getParent()).inflate(R.layout.trial_video_player, null)); 


     mPreview = (SurfaceView) findViewById(R.id.surface_view); 
     holder = mPreview.getHolder(); 
     holder.addCallback(this); 
     holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

    } 
private void playMediaPlayerVideo() { 
     Log.d(TAG, "playMediaPlayerVideo called"); 
     doCleanUp(); 
     try { 
      if (videoURL == "") { 
       // Tell the user to provide a media file URL. 
       Toast.makeText(this,"Please edit MediaPlayerDemo_Video Activity," 
         + " and set the path variable to your media file URL.", 
         Toast.LENGTH_LONG).show(); 
      } 
      Log.d("TrailVideoActivity", videoURL); 
      // Create a new media player and set the listeners 
      mMediaPlayer = new MediaPlayer(); 
      mMediaPlayer.setDataSource(videoURL); 
      mMediaPlayer.setDisplay(holder); 
      mMediaPlayer.prepareAsync(); 
      mMediaPlayer.setOnBufferingUpdateListener(this); 
      mMediaPlayer.setOnCompletionListener(this); 
      mMediaPlayer.setOnPreparedListener(this); 
      mMediaPlayer.setOnVideoSizeChangedListener(this); 
      //mMediaPlayer.setVideoQuality(MediaPlayer.VIDEOQUALITY_HIGH); 
      //mMediaPlayer.setScreenOnWhilePlaying(true); 
      //mMediaPlayer.setLooping(true); 
      mMediaPlayer.setAudioStreamType(2); 


     } 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"); 
     playMediaPlayerVideo(); 

    } 

    @Override 
    protected void onPause() { 
     Log.d(TAG, "onPause called"); 
     super.onPause(); 
     releaseMediaPlayer(); 
     doCleanUp(); 
    } 

    @Override 
    protected void onDestroy() { 
     Log.d(TAG, "onDestroy called"); 
     super.onDestroy(); 
     releaseMediaPlayer(); 
     doCleanUp(); 
    } 

    private void releaseMediaPlayer() { 
     Log.d(TAG, "releaseMediaPlayer called"); 
     if (mMediaPlayer != null) { 
      mMediaPlayer.release(); 
      mMediaPlayer = null; 
     } 
    } 

    private void doCleanUp() { 
     Log.d(TAG, "doCleanUp called"); 
     mVideoWidth = 0; 
     mVideoHeight = 0; 
     mIsVideoReadyToBePlayed = false; 
     mIsVideoSizeKnown = false; 

    } 

    private void startVideoPlayback() { 
     Log.v(TAG, "startVideoPlayback"); 
     holder.setFixedSize(mVideoWidth, mVideoHeight); 
     /*holder.setKeepScreenOn(false); 
     holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);*/ 
     mMediaPlayer.start(); 
     app.dismissDialog(); 
    } 
} 

在此先感謝。

回答

0

我覺得你也可以叫MediaPlayerrelease()方法烏爾surfaceDestroyed方法如下面

public void surfaceDestroyed(SurfaceHolder surfaceholder) { 
    Log.d(TAG, "surfaceDestroyed called"); 
    if (mMediaPlayer != null) { 
     mMediaPlayer.release(); 
     mMediaPlayer = null; 
    } 
} 

而且美國可以在OnBackPressed

釋放MediaPlayer u能檢查,如果這個工程...