在Android中静音流

时间:2012-10-27 15:42:30

标签: android audio stream mute

我已经构建了一个小应用程序,可以使用类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;
    }
}

1 个答案:

答案 0 :(得分:0)

首先,要注意it's not recommended

  

为了获得更好的用户体验,应用程序必须取消静音流的静音   在onPause()中,如果合适,在onResume()中再次静音。

但我猜你知道你在做什么,所以我们走了。

请注意setStreamMute

上的文档中的这一行
  

静音命令可以防止客户端进程死亡:如果a   流上有活动静音请求的进程终止,此流将   自动取消静音。

我已经检查了我的设备,事实上,当我退出活动时,流保持静音。但是一旦我杀了这个过程,静音就会消失。 看看activity lifecycle

由于您当前的方法无法可靠地运行,您可以编写一个foreground service来触发静音 - 从您的活动中启动该服务。 您也可能需要setStreamSolo

两个重要的事情。

  1. Volume==0muted不是一回事。即stream可以有volume == 0但不要静音。但是,如果 <静音,则音量将始终为0
  2. 静音请求是累积的。即如果您设置了两次静音,则必须取消静音两次 - 您的代码无法处理
  3. 作为旁注,对于这样的应用程序,您可能希望使用小部件而不是活动。


    偏离主题。看起来很多人并不太了解布尔的工作方式。 当我看到像你这样的代码时,这里有一些简化的重写。

    @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);
    }