You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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到初始状态:

修改harropMediaplayerplysound方法,添加重置操作:

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数据,存在误删其他配置的风险。应该明确设置soundMutefalse

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

火山引擎 最新活动