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
相关产品推荐
相关产品推荐

