5

我已经构建了一个小应用程序,它使用 class 将音乐流静音/取消静音AudioManager。事实上,它一直有效,直到我关闭应用程序。即我已将流静音,我关闭了应用程序,我重新启动了应用程序,并且该按钮不再取消静音流。我在网上搜索过,但似乎没有人遇到过这个问题。

这是我的代码:

public class ControlloVolume extends Activity {
ToggleButton tb_mute;
Button btn_mute;
AudioManager mAudioManager;
boolean mute;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_controllo_volume);

    tb_mute = (ToggleButton) findViewById(R.id.tb_mute);
    btn_mute = (Button) findViewById(R.id.btn_mute);
    mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);

    if(mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC)==0){
        mute = true;
        tb_mute.setChecked(mute);
    }else{
        mute = false;
        tb_mute.setChecked(mute);
    }

    }

public void onButtonClicked(View view){
    if(!mute){
        mAudioManager.setStreamMute(AudioManager.STREAM_MUSIC, true);
        tb_mute.setChecked(true);
        mute = true;
    }else{
        mAudioManager.setStreamMute(AudioManager.STREAM_MUSIC, false);
        tb_mute.setChecked(false);
        mute = false;
    }
}
4

1 回答 1

0

首先,注意不推荐

为了更好的用户体验,应用程序必须在 onPause() 中取消静音流,并在适当的情况下在 onResume() 中再次静音。

但我假设你知道你在做什么,所以我们开始吧。

请注意setStreamMute上的文档中的这一行

静音命令可防止客户端进程死亡:如果在流上具有活动静音请求的进程死亡,则该流将自动取消静音。

我检查了我的设备,确实,当我刚刚退出我的活动时,流保持静音。但是一旦我终止进程,静音就会消失。看一下活动生命周期

由于您当前的方法无法可靠地工作,您可以编写一个前台服务来触发静音 - 从您的活动中启动该服务。此外,您可能需要setStreamSolo

两件重要的事情。

  1. Volume==0并且muted不是一回事。即流可以有volume==0 但不能静音。虽然如果流静音,音量将始终为 0
  2. 静音请求是累积的。即,如果您设置了两次静音,您也必须取消静音两次 - 您的代码无法处理

作为旁注,对于这样的应用程序,您可能希望使用小部件而不是活动。


无关。令人惊讶的是,很多人并不完全了解布尔值是如何工作的。当我经常看到像你这样的代码时,这里有一点简化的重写。

@Override
public void onCreate(Bundle savedInstanceState) {
    // ... setup just like you did

    // boolean is just like any other type. You can assign not only
    // constants, but expressions too
    mute = (mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC)==0);
    tb_mute.setChecked(mute);
}

public void onButtonClicked(View view){
    mute = !mute; // invert value
    mAudioManager.setStreamMute(AudioManager.STREAM_MUSIC, mute);
    tb_mute.setChecked(mute);
}
于 2014-06-19T08:51:02.173 回答