Android启动音静音功能异常:SharedPreferences配置后应用崩溃
解决启动音效静音选项的崩溃与默认静音问题
咱们先拆解你的问题:一是应用默认音效处于静音状态,二是勾选静音选项重启后应用崩溃,抛出IllegalStateException异常。下面一步步来修复这些问题:
1. 修复默认静音问题
你的volumeSetting方法中,SharedPreferences获取静音状态时默认值设为了true,这直接导致首次打开应用就会静音。把默认值改成false即可恢复默认不静音的逻辑:
private void volumeSetting(){ SharedPreferences sharedpreferences = getSharedPreferences("myPreference", Context.MODE_PRIVATE); // 将默认值从true改为false,让应用默认不静音 boolean bnSoundMute = sharedpreferences.getBoolean("soundMute", false); if(bnSoundMute){ App_Objects.mp.setVolume(0,0); // 静音 }else{ App_Objects.mp.setVolume(1,1); // 取消静音(最大音量) } }
2. 修复MediaPlayer状态异常导致的崩溃
崩溃的核心原因是全局MediaPlayer的状态机冲突:App_Objects.mp是全局实例,当你设置过音量后,它的状态可能处于Prepared/Started状态,此时直接调用setDataSource就会触发IllegalStateException。我们需要在每次播放前重置MediaPlayer到初始状态:
修改harropMediaplayer的plysound方法,添加重置操作:
public void plysound() { mp = App_Objects.mp; String j = media.toString(); Log.i("Url", j); try { // 重置MediaPlayer到初始状态,避免状态冲突 mp.reset(); mp.setDataSource(j); mp.prepare(); Log.i("Sound playing", "Ok"); mp.start(); } catch (IOException e) { e.printStackTrace(); } }
另外,你的stopplying方法直接调用stop()+release()会导致全局MediaPlayer被释放,后续无法复用,改成只重置不释放:
public void stopplying(){ if(mp != null){ if(mp.isPlaying()){ mp.stop(); } mp.reset(); // 重置而非释放,保留全局实例供后续使用 } }
3. 修复设置页面的SharedPreferences操作错误
你在设置页面的onCheckedChanged里,未勾选时用了editor.clear(),这会清除所有SharedPreferences数据,存在误删其他配置的风险。应该明确设置soundMute为false:
btnradio.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { editor.putBoolean("soundMute", b); editor.apply(); if(b){ Log.i( "onCheckedChanged: ","Activated"); } else { Log.i("onCheckChanged: ","Deactivated"); } } });
4. 优化闪屏页的播放逻辑
在闪屏页调用mp.plysound()之前,先调用volumeSetting()设置音量,确保播放时音量配置已经生效:
// 调整顺序:先设置音量,再播放音效 volumeSetting(); mp.plysound();
最后,记得在应用退出时(比如MainActivity的onDestroy方法中)释放全局MediaPlayer,避免内存泄漏:
@Override protected void onDestroy() { super.onDestroy(); if(App_Objects.mp != null){ App_Objects.mp.release(); App_Objects.mp = null; } }
内容的提问来源于stack exchange,提问作者markharrop




