1

ビデオを再生する単純なビデオビューがあります。縦向きから横向きに向きが変わったときにアクティビティを再バッファリングしたり再起動したりせずに、スムーズに再生できるようにしようとしています。ビデオコードは次のとおりです。

        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 に答える