Android 媒体播放器在屏幕旋转时重新初始化
Android mediaplayer reinitializes on screen rotation
我streaming/playing已经在VideoView
下载了视频。当我旋转屏幕时,所有对象都会重新初始化,以便从头开始播放视频,或者如果获取当前 position 并在屏幕旋转时设置 position,则视频将再次流式传输。由于来自后端的视频是加密的,加载它需要很长时间,导致非常糟糕的用户体验。
以下是我 os 到目前为止的内容。
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
没有被调用。我有一些工作要做,所以我希望它被调用。
我使用的另一种方法是使用 Mediaplayer
和 SurfaceView
它也可以工作,除了 mediaplayer
在某些情况下无法正常工作(每个视频的视频大小都会变化 os)
基本上我想要的是在上面的代码中应该调用 onRestoreInstanceState
并且视频不应该在屏幕旋转时重新初始化(或立即播放)
已找到解决方案,如果我们将 android:configChanges="screenSize|orientation"
添加到 manifest.xml,则只会调用 onConfigurationChanged
覆盖,不会重新创建 activity。因为我在屏幕上有一个 VideoView
和一个 ListView
,它有父级 LinearLayout
,所以我在 onConfigurationChanged
.
中将方向从垂直更改为水平
您必须相应地在纵向或横向模式下动态设置所需的视图。
我streaming/playing已经在VideoView
下载了视频。当我旋转屏幕时,所有对象都会重新初始化,以便从头开始播放视频,或者如果获取当前 position 并在屏幕旋转时设置 position,则视频将再次流式传输。由于来自后端的视频是加密的,加载它需要很长时间,导致非常糟糕的用户体验。
以下是我 os 到目前为止的内容。
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
没有被调用。我有一些工作要做,所以我希望它被调用。
我使用的另一种方法是使用 Mediaplayer
和 SurfaceView
它也可以工作,除了 mediaplayer
在某些情况下无法正常工作(每个视频的视频大小都会变化 os)
基本上我想要的是在上面的代码中应该调用 onRestoreInstanceState
并且视频不应该在屏幕旋转时重新初始化(或立即播放)
已找到解决方案,如果我们将 android:configChanges="screenSize|orientation"
添加到 manifest.xml,则只会调用 onConfigurationChanged
覆盖,不会重新创建 activity。因为我在屏幕上有一个 VideoView
和一个 ListView
,它有父级 LinearLayout
,所以我在 onConfigurationChanged
.
您必须相应地在纵向或横向模式下动态设置所需的视图。