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

标签 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 并且视频不应该在屏幕旋转中重新初始化(或没有延迟地播放)

最佳答案

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

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

关于Android 媒体播放器在屏幕旋转时重新初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34282975/

相关文章:

java - 如何在Android中录制麦克风和媒体播放器

android - 从 Android 中的前置摄像头录制时,视频会上下颠倒播放

android - 如何在视频 View 中播放 youtube 视频

java - 使用 Android 日历提供程序创建全天事件

java - 如何获取以毫秒为单位的 UTC 日期?

java - Android - 后退按钮导致问题

Android:从应用程序类启动新 Activity

java - MediaController - 调用 Show() 时出错

android - 在 VideoView 中添加循环

android - 如何检测错误发生的原因