Android Studio(Java)在线音频播放停止按钮自动重启问题求助
问题解决思路及修改方案
你的问题核心在于停止按钮的逻辑错误:调用mp.stop()后执行的mp.prepareAsync()会触发之前设置的OnPreparedListener,而该监听器里的mp.start()会直接启动音频,导致自动重启。另外,MediaPlayer在停止状态下直接prepare会复用原有数据源和监听器,进一步加剧了这个问题。
修改步骤
- 调整停止按钮逻辑:停止音频后重置MediaPlayer到初始状态,清除原有数据源和监听器,从根源避免自动播放
- 优化播放按钮逻辑:确保从停止状态点击播放时,能正确重新初始化MediaPlayer,避免状态异常崩溃
修改后的完整代码
botonPlay.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (longitud > 0){ mp.seekTo(longitud); mp.start(); } else { try { mp.reset(); // 重置后重新绑定音频源 mp.setDataSource(rutaSonido); mp.setAudioStreamType(AudioManager.STREAM_MUSIC); mp.prepareAsync(); mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mediaPlayer) { mp.start(); } }); } catch (IOException e) { throw new RuntimeException(e); } } } }); botonPausa.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mp.pause(); longitud = mp.getCurrentPosition(); } }); botonStop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (mp.isPlaying() || mp.isPrepared()) { mp.stop(); mp.reset(); // 重置MediaPlayer,清除所有关联配置 longitud = 0; } } });
关键说明
- 停止按钮中调用
mp.reset(),让MediaPlayer回到Idle状态,彻底断开与当前音频的绑定,同时清除之前设置的OnPreparedListener,杜绝自动触发播放的可能 - 播放按钮中增加
mp.reset(),确保从停止状态启动时,MediaPlayer能重新完成初始化流程,避免因状态冲突导致崩溃 - 移除停止按钮中的
mp.prepareAsync(),这是导致音频自动重启的直接诱因
内容的提问来源于stack exchange,提问作者ira
相关产品推荐
相关产品推荐

