You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中复选框再次勾选后MediaPlayer无法播放音乐求助

解决MediaPlayer停止后无法再次播放的问题

这个问题我之前也碰到过,核心原因是MediaPlayer的状态生命周期限制:当你调用mediaPlayer.stop()后,MediaPlayer会进入Stopped状态,这个状态下没法直接调用start()恢复播放,必须重新初始化或者完成prepare流程才行。你的初始代码里用MediaPlayer.create()创建实例时,系统已经自动帮你完成了prepare,但stop之后这个实例就不能直接复用了。

下面给你两种可行的解决方案,根据你的实际需求选就行:

方案一:彻底停止后重新创建MediaPlayer(适合需要从头播放的场景)

修改你的playSong方法,每次停止后释放旧实例,勾选时重新创建并播放:

public class Options extends AppCompatActivity {
    MediaPlayer mediaPlayer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_options);
        // 这里不用提前创建实例,放到第一次播放时再初始化更合理
        // mediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.music01);
    }

    public void playSong(View view) {
        CheckBox musicCheck = findViewById(R.id.musicCheck);
        if (musicCheck.isChecked()) {
            // 先释放可能存在的旧实例,避免内存泄漏
            if (mediaPlayer != null) {
                mediaPlayer.release();
            }
            // 重新创建实例并开始播放
            mediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.music01);
            mediaPlayer.start();
        } else {
            // 停止播放并释放资源
            if (mediaPlayer != null && mediaPlayer.isPlaying()) {
                mediaPlayer.stop();
                mediaPlayer.release();
                mediaPlayer = null;
            }
        }
    }

    // 别忘了在Activity销毁时释放资源,防止内存泄漏
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mediaPlayer != null) {
            mediaPlayer.release();
            mediaPlayer = null;
        }
    }
}

方案二:用pause()替代stop()(适合暂停后继续播放的场景)

如果你的需求只是暂停音乐(而不是彻底停止并从头播放),用pause()会更高效,因为暂停后的MediaPlayer可以直接调用start()继续播放当前进度:

public class Options extends AppCompatActivity {
    MediaPlayer mediaPlayer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_options);
        mediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.music01);
    }

    public void playSong(View view) {
        CheckBox musicCheck = findViewById(R.id.musicCheck);
        if (musicCheck.isChecked()) {
            if (!mediaPlayer.isPlaying()) {
                mediaPlayer.start();
            }
        } else {
            if (mediaPlayer.isPlaying()) {
                mediaPlayer.pause();
            }
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mediaPlayer != null) {
            mediaPlayer.release();
            mediaPlayer = null;
        }
    }
}

两种方案的区别:

  • 方案一每次停止后都会销毁旧实例,再次播放时从头开始,适合需要完全重置播放的场景;
  • 方案二更节省资源,暂停后可以从当前位置继续播放,体验更流畅。

内容的提问来源于stack exchange,提问作者user8991131

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:50:19