android - Android 中的静音流

标签 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;
    }
}

最佳答案

首先要注意it's not recommended

For a better user experience, applications MUST unmute a muted stream in onPause() and mute it again in onResume() if appropriate.

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

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

The mute command is protected against client process death: if a process with an active mute request on a stream dies, this stream will be unmuted automatically.

我检查了我的设备,确实,当我刚刚退出我的 Activity 时,流保持静音。但是,一旦我终止了该过程,静音就会消失。 看看activity lifecycle .

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

两件重要的事情。

  1. Volume==0muted 不是一回事。 IE。流可以有 volume==0 但不能静音。尽管如果流 静音,音量将始终为 0
  2. 静音请求是累积的。 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);
}

关于android - Android 中的静音流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13101624/

相关文章:

firebase - 如何在firebase firestore中准确合并多个流

java - 在 Eclipse 中管理应用程序的 Lite 和 Pro 版本

android - Android是否支持虚拟内存

Android AdMob 横幅广告未显示

java - 如何无延迟播放WAV文件?

android - Android中的简单语音命令

java - Libgdx Scene2D 表背景图像未显示

audio - 从黑莓应用程序播放音频?

c# - 你如何从无限字节流中读取 UTF-8 字符 - C#

c# - 解析大文本文件,即时修改