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

Android应用重新打开后MediaPlayer无法自动播放音频问题

问题原因
  • 你使用MediaPlayer.create()方法创建播放器实例时,SDK内部已经同步完成了音频资源的加载和准备工作,onPrepared回调只会在手动调用prepareAsync()触发异步准备流程时才会执行。你在onResume中才注册setOnPreparedListener时,准备流程早就结束,回调永远不会触发,自然不会执行启动播放的逻辑。
  • 你在onPause中记录了播放暂停的位置length,但恢复播放时没有调用seekTo回到对应位置,也没有主动调用start()方法启动播放。
  • 原实现缺少资源释放逻辑,存在音频资源泄漏、内存泄漏的风险,同时没有做空值和状态判断,容易在Activity重建、系统回收资源后触发崩溃。
修复后的完整代码
public MediaPlayer mediaPlayer;
int length = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 替换为你自己的布局文件ID
    setContentView(R.layout.activity_main);
    mediaPlayer = MediaPlayer.create(this, R.raw.andhadhun);
}

@Override
protected void onPause() {
    super.onPause();
    // 增加状态判断,避免播放器未初始化/未播放时调用异常
    if (mediaPlayer != null && mediaPlayer.isPlaying()) {
        mediaPlayer.pause();
        length = mediaPlayer.getCurrentPosition();
    }
}

@Override
protected void onResume() {
    super.onResume();
    if (mediaPlayer != null) {
        // 回到上次暂停的播放位置
        mediaPlayer.seekTo(length);
        // 直接启动播放即可,create()创建的播放器已经处于准备完成状态
        mediaPlayer.start();
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    // 页面销毁时必须释放播放器资源,避免资源泄漏
    if (mediaPlayer != null) {
        mediaPlayer.release();
        mediaPlayer = null;
    }
}
补充说明
  • 只有当你通过new MediaPlayer()构造方法创建实例、手动设置数据源后调用prepareAsync()异步准备时,才需要通过setOnPreparedListener监听准备完成事件再调用start()。使用create()方法创建的实例不需要这一步。
  • 所有播放器操作前都建议加非空判断和播放状态判断,避免应用切后台被系统回收资源、屏幕旋转重建Activity时触发崩溃。
  • 如果需要支持音频后台播放,不能仅依赖Activity生命周期管理MediaPlayer,需要结合前台Service实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 05:42:15