2012-08-14 59 views
13

我有一个VideoView,当我开始一个电子邮件意图时它会暂停。当电子邮件意图完成后,我希望videoView继续播放,但是,它会从头开始重新播放。从简历中继续播放VideoView

@Override 
public void onPause() { 
    Log.d(TAG, "onPause called"); 
    super.onPause(); 
    videoView.pause(); 
} 
@Override 
public void onResume() { 
    super.onResume(); 
    Log.d(TAG, "onResume called"); 
    videoView.start();//resume() doesnt work 
} 

如何让videoView从停止的位置恢复。

回答

28

这个怎么样:

@Override 
public void onResume() { 
    super.onResume(); 
    Log.d(TAG, "onResume called"); 
    videoView.seekTo(stopPosition); 
    videoView.start(); //Or use resume() if it doesn't work. I'm not sure 
} 

// This gets called before onPause so pause video here. 
@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    stopPosition = videoView.getCurrentPosition(); 
    videoView.pause(); 
    outState.putInt("position", stopPosition); 
} 

然后在您的onCreate()调用从包中stopPosition并设置它在全球

@Override 
protected void onCreate(Bundle args) { 
    super.onCreate(args); 
    if(args != null) { 
     stopPosition = args.getInt("position"); 
    } 
+1

你可以在onSaveInstanceState(Bundle outState)期间在outState中存储你的'stopPosition',比你可以在你的活动中使用onCreate(Bundle savedInstanceState)提取它。 – Entreco 2012-12-28 15:00:33

11

使用seekTo给出了一个轻微的闪烁efeect再次开始视频。更好的方法是使用pause()start()方法MediaPlayer类而不是使用来自VideoView的方法。 VideoViewstart()方法从头开始重新开始视频,但start()方法MediaPlayer如果先前已调用pause()方法,则重新开始播放视频。

下面是官方Android医生说

公共无效的start()

在API级别1开始或继续播放。如果先前已暂停播放 ,则播放将从暂停的 处继续播放。如果播放已停止,或从未开始播放,则将从头开始播放。

你可以得到一个VideoViewVideoViewOnPreparedListener相关的MediaPlayer

public class MainActivity extends Activity { 

    private MediaPlayer mMediaPlayer; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     VideoView videoView = (VideoView) findViewById(R.id.videoView1); 
     videoView.setVideoPath(path); 
     videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 

      @Override 
      public void onPrepared(MediaPlayer mp) { 
       mMediaPlayer = mp; 

      } 
     }); 
    } 

} 

然后后续pause()resume()方法可以在MediaPlayer对象本身被调用。

//To pause the video 
mMediaPlayer.pause(); 

//To resume the video 
mMediaPlayer.start(); 

非常简单而有效的解决方案。希望能帮助到你!

+0

优秀的答案!但是...我想知道为什么suspend()和resume()方法?如果暂停/开始做的伎俩。 – 2014-06-05 14:42:59

+3

@NicolasJafelle VideoView'resume'方法似乎没有工作。它从一开始就开始播放视频。可能是'VideoView'的一些错误。 'suspend()'是从内存中释放视频。它在内部执行'MediaPlayer''resese()'。 – 2014-06-05 15:06:36

+1

在我的应用程序中,它给出了调用mMediaPlayer.start()的illegalStateException;在恢复中 – beginner 2016-08-10 12:48:26