Android媒体播放器重新初始化屏幕旋转

时间:2015-12-15 07:06:28

标签: android android-mediaplayer android-videoview mediacontroller

我正在VideoView播放/播放已下载的视频。当我旋转屏幕时,所有对象都会重新初始化,以便从头开始播放视频,或者如果获取当前位置并在屏幕旋转时设置位置,则视频将再次流式传输。由于来自后端的视频是加密的,因此加载它需要花费很多时间,从而导致非常糟糕的用户体验。 以下是我的目标。

public class MainActivity extends AppCompatActivity {
    VideoView videoView;
    Context context;
    int stopPosition = 0;
    private static MediaController mediaController;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = this;
        videoView = (VideoView) findViewById(R.id.videoView1);
        if (savedInstanceState != null) {
            stopPosition = savedInstanceState.getInt("position");
            Log.d("", "savedInstanceState called" + stopPosition);
        }
        mediaController = new MediaController(context);
        mediaController.setAnchorView(videoView);
        String path = "android.resource://" + getPackageName() + "/" + R.raw.videotest;
        Uri uri = Uri.parse(path);
        videoView.setMediaController(mediaController);
        videoView.setVideoURI(uri);
        videoView.requestFocus();
        videoView.start();
    }


    @Override
    public void onPause() {
        Log.d("", "onPause called");
        super.onPause();
        videoView.pause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d("", "onResume called" + stopPosition);
        videoView.seekTo(stopPosition);
        videoView.resume();
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        videoView.pause();
        outState.putInt("position", 100);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        stopPosition = savedInstanceState.getInt("position");
    }


}

当我使用以下方法时,这个问题就解决了,但是一些新问题开始了。

如果我将android:configChanges="screenSize|orientation"添加到AndroidManifest.xml,则除非onSaveInstanceState未被调用,否则它的效果非常好。我有一些工作要做,所以我希望它被称为。 我使用的另一种方法是使用MediaplayerSurfaceView,除了mediaplayer在某些情况下无法正常运行(每个视频中的视频大小更改)之外,它也能正常工作

基本上我想要的是上面的代码onRestoreInstanceState应该被调用,视频不应该在屏幕旋转中重新初始化(或没有延迟播放)

1 个答案:

答案 0 :(得分:2)

找到一个解决方案,如果我们向manifest.xml添加android:configChanges="screenSize|orientation",则只调用onConfigurationChanged覆盖,不重新创建活动。由于我在屏幕中有一个VideoView和一个ListView,其父级为LinearLayout,因此我将方向更改为onConfigurationChanged中的水平方向。

您必须相应地在纵向或横向模式下动态设置所需的视图。