You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

横竖屏切换时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重建后再恢复播放:

  1. 在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);
    }
}
  1. 在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

火山引擎 最新活动