2012-09-27 148 views
5

对于自定义视频,我必须重写MediaController(更改按钮的设计并连接到按钮暂停/播放选择器)。情况是这样的:将视频暂停并转动应用程序,然后再次恢复,视频开始再次播放,而不是从暂停的位置开始播放,因此问题出现了:如何使视频开始播放从哪里停下来? VideoActivity中需要更改哪些内容?从VideoView中的暂停状态播放视频

public class VideoActivity extends Activity { 

VideoView videoView; 

VkMediaController mc; 

private static final String CURRENT = "duration"; 

private static final String URL = "url"; 

private Uri mURI; 

private int mCurrentPosition = -1; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    this.setContentView(R.layout.video_view_player); 
    videoView = (VideoView) findViewById(R.id.videoViewplayer); 
    mc = new VkMediaController(this); 
    mURI = getIntent().getData(); 
    if (savedInstanceState != null) { 
     mURI = Uri.parse(savedInstanceState.getString(URL)); 
     mCurrentPosition = savedInstanceState.getInt(CURRENT); 

    } 
    videoView.setMediaController(mc); 
    videoView.setVideoURI(mURI); 
    videoView.requestFocus(); 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
    videoView.start(); 
    if (mCurrentPosition != -1) { 
     videoView.seekTo(mCurrentPosition); 
    } 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    outState.putInt(CURRENT, videoView.getCurrentPosition()); 
    outState.putString(URL, mURI.toString()); 
    super.onSaveInstanceState(outState); 
} 

}

+0

什么是错误/问题?这段代码有什么错误? – njzk2

+0

没有错误,但没有从当前位置开始播放,并且从 – ricky

+0

开始您是否检查了mCurrentPosition的值? – njzk2

回答

14

我认为这个问题是videoView.getCurrentPosition()总是返回0,当你调用内部onSaveInstanceState(Bundle outState),COS当时的视频已经复位,所以叫videoView.getCurrentPosition()onPause(),这将返回你所期望的值。

+0

后重新启动视频谢谢,我尝试做 – ricky

+0

保护无效onPause(){ videoView.pause(); videoView.getCurrentPosition(); super.onPause(); }它是正确的? – ricky

+0

我必须在onSaveInstanceState(Bundle outState)中保留mCurrentPosition? – ricky

2

我有同样的问题。我以为我做了一切正确,但它没有奏效。然后我只是改变了顺序,所以我第一次打电话VideoView.seekTo(),然后VideoView.start()。这工作。 我也有VideoView.requestFocus()在那里,但我不知道这是否重要。

videoPlayer.requestFocus(); 
videoPlayer.seekTo(position); 
videoPlayer.start(); 

所以,如果你确定你的位置变量有正确的值,这可能是你的答案。 视频未加载时,您可能无法查找。像这样实现onPreparedListener:

public class VideoActivity extends Activity implements OnPreparedListener { 
    VideoView videoPlayer; 
    int position; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if(savedInstanceState!=null){ 
    position=savedInstanceState.getInt("pos") 
    } 
    // setting up the videoview 
    setContentView(R.layout.activity_video); 
    getIntent().getExtras().getString("url"); 
    Uri videouri = Uri.parse(getIntent().getExtras().getString("url")); 
    videoPlayer = (VideoView) findViewById(R.id.videoView); 
    videoPlayer.setOnPreparedListener(this); 
    videoPlayer.setKeepScreenOn(true); 
    videoPlayer.setVideoURI(videouri); 

    } 

    /** 
    * Start the plaback when the video is loaded 
    * 
    * @param mp 
    * @see android.media.MediaPlayer.OnPreparedListener#onPrepared(android.media.MediaPlayer) 
    */ 
    public void onPrepared(MediaPlayer mp) { 
    //this is a TextView infront of the VideoView which tells the User the Video is loading- hide that 
    findViewById(R.id.tv_video_load).setVisibility(View.GONE); 

    videoPlayer.requestFocus(); 
    videoPlayer.seekTo(position) 
    videoPlayer.start(); 
} 
} 
+0

你可以在onCreate()或onStart()中调用这些方法吗? – ricky

+0

哦你是对的。我已经实现了OnPreparedListener,这一切都在onPrepared方法中。有意义的是,如果视频尚未加载,则无法查找。 –

+0

我在onStar中调用了这些方法,它是正确的? – ricky