横竖屏切换时MediaPlayer重复播放音频,如何实现续播?
解决横竖屏切换时MediaPlayer音频重启的问题
哥们,你碰到的这个问题其实是Android系统的默认机制搞的鬼——当屏幕横竖屏切换时,Activity会被销毁然后重新创建,你的MediaPlayer跟着被重新初始化,音频自然就从头播放了。下面给你两种靠谱的解决思路:
方法一:直接禁止Activity在横竖屏切换时重建
这是最省心的办法,只需要在AndroidManifest.xml里给你的Activity加个配置属性,告诉系统“横竖屏切换别搞我Activity的重建”:
<activity android:name=".YourActivity" <!-- 替换成你的Activity类名 --> android:configChanges="orientation|screenSize"> </activity>
加了这个配置后,横竖屏切换时Activity不会销毁重建,而是会触发onConfigurationChanged方法。如果需要调整横竖屏对应的UI布局,你可以重写这个方法:
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // 这里可以根据新的屏幕方向调整UI,比如切换横屏竖屏的布局 // 但MediaPlayer会继续正常播放,完全不受影响 }
方法二:保存播放状态,重建后恢复
如果因为业务需求不能禁止Activity重建,那咱就把当前的播放进度和状态保存下来,等Activity重建后再恢复播放:
- 在Activity销毁前保存状态:
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); // 先判断MediaPlayer是否存在且正在播放 if (mediaPlayer != null && mediaPlayer.isPlaying()) { // 保存当前播放的进度位置 outState.putInt("playPosition", mediaPlayer.getCurrentPosition()); // 标记当前处于播放状态 outState.putBoolean("isPlaying", true); } }
- 在Activity重建后恢复播放:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_viewpager_ex); // 这里写你初始化MediaPlayer的代码,比如设置音频源、准备播放等 initMediaPlayer(); // 如果是重建的Activity,取出之前保存的状态 if (savedInstanceState != null) { int playPosition = savedInstanceState.getInt("playPosition", 0); boolean wasPlaying = savedInstanceState.getBoolean("isPlaying", false); if (wasPlaying) { mediaPlayer.seekTo(playPosition); // 跳转到之前的播放位置 mediaPlayer.start(); // 继续播放 } } }
额外小贴士
如果你的音频播放是长期需求,比如后台也能播放,更推荐把MediaPlayer放到Service里。Service的生命周期不受Activity影响,横竖屏切换完全不会干扰音频播放,这才是更稳定的方案哦~
内容的提问来源于stack exchange,提问作者Apps Vine




