我已经构建了一个使用类 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;
    }
}

最佳答案

首先,当心it's not recommended



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

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



我已经检查了我的设备,确实,当我刚刚退出我的 Activity 时,流保持静音。但是,一旦我杀死了进程,静音就会消失。
看看 activity lifecycle

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

两个重要的 事情。

  • Volume==0muted 不是一回事。 IE。流可以有 volume==0 但不能静音。虽然如果流被静音,音量将始终为 0
  • 静音请求是累积的。 IE。如果您设置了两次静音,则还必须取消静音两次 - 您的代码无法处理该

  • 作为旁注,对于此类应用程序,您可能希望使用小部件而不是 Activity 。

    题外话。 出人意料的是,很多人不太明白 bool 值是如何工作的。
    当我经常看到像你这样的代码时,这里有一些简化的重写。
    @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);
    }
    

    10-08 07:25
    查看更多