1

我有一个播放视频的简单视频视图。我试图让它顺利播放,而不是在方向从纵向更改为横向时重新缓冲或重新启动 Activity。这是视频代码:

        uriStr = ("http://video.com/video/" + yyyyMdd_Str + "/" + yyyyMdd_Str + ".mp4");

    testMediaCon1_MC = new MediaController(this);
    testMediaCon1_MC.setAnchorView(testVideo1_VV);
    testVideo1_VV.setMediaController(testMediaCon1_MC);
    testVideo1_VV.setKeepScreenOn(true);
    testVideo1_VV.setVideoPath(uriStr);
    testVideo1_VV.requestFocus();
    testVideo1_VV.start();

而且我认为要使视频在方向更改时流畅播放,我必须获取视频的当前位置,然后在方向更改发生时加载该当前位置。所以我有代码来获取视频位置:

    @Override
protected void onSaveInstanceState(Bundle out) {
 // TODO Auto-generated method stub
 super.onSaveInstanceState(out);
 if (testVideo1_VV.isPlaying()) out.putInt("pos", testVideo1_VV.getCurrentPosition());
}

但现在我无法弄清楚在这里加载视频位置的代码是什么:

    @Override
protected void onRestoreInstanceState(Bundle in) {
 // TODO Auto-generated method stub
 super.onRestoreInstanceState(in);
 //load video position here
}

有任何想法吗?还是我这样做完全错了?

4

2 回答 2

2

您可以使用seekTo从保存的位置重新开始播放,但它不能解决重新缓冲的问题 - 一旦您的 VideoView 被销毁,缓冲区就会被刷新,在您重新开始播放之前,必须准备好媒体并再次缓冲。

如果您想在方向更改后继续无缝播放,您必须保持活动活跃并自己处理更改 - 请参阅http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange

于 2013-08-20T15:27:02.547 回答
0

我想出的解决方案是,在方向更改时使视频全屏并不是onRestoreInstanceState像我想的那样在覆盖中完成,而是在覆盖中 完成onConfigurationChanged。在清单中,android:configChanges="orientation"应该调用,然后覆盖onConfigurationChanged,这就是我如何让它为我工作:

    @Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {

        buttonsLL.setVisibility(View.GONE);
        bufferLL.setVisibility(View.GONE);
        listLL.setVisibility(View.GONE);

        RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) videoSA_VV
                .getLayoutParams();
        lp.addRule(RelativeLayout.CENTER_IN_PARENT, 1);
        lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, 1);
        lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT, 1);
        lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, 1);
        videoSA_VV.setLayoutParams(lp);

    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {

        buttonsLL.setVisibility(View.VISIBLE);
        bufferLL.setVisibility(View.VISIBLE);
        listLL.setVisibility(View.VISIBLE);

        RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) videoSA_VV
                .getLayoutParams();
        lp.addRule(RelativeLayout.CENTER_IN_PARENT, 1);
        lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, 0);
        lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT, 0);
        lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, 0);
        videoSA_VV.setLayoutParams(lp);
    }

}

关键是将不想显示的视图的可见性设置为 GONE,然后在方向改变时将它们设置回 VISIBLE。在将视图设置为 GONE 后,拉伸 VideoView 以填充父视图。

于 2013-09-12T18:40:17.027 回答