在安卓系统中静音全局声音

27

有没有一种方法可以通过应用程序按钮静音全局声音?

6个回答

45

他们把事情搞得比必要的更加复杂。你可以直接使用AudioManager.setStreamMute()。请随意使用下面的代码。

//mute audio
AudioManager amanager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
             amanager.setStreamMute(AudioManager.STREAM_NOTIFICATION, true);
             amanager.setStreamMute(AudioManager.STREAM_ALARM, true);
             amanager.setStreamMute(AudioManager.STREAM_MUSIC, true);
             amanager.setStreamMute(AudioManager.STREAM_RING, true);
             amanager.setStreamMute(AudioManager.STREAM_SYSTEM, true);


//unmute audio
AudioManager amanager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
             amanager.setStreamMute(AudioManager.STREAM_NOTIFICATION, false);
             amanager.setStreamMute(AudioManager.STREAM_ALARM, false);
             amanager.setStreamMute(AudioManager.STREAM_MUSIC, false);
             amanager.setStreamMute(AudioManager.STREAM_RING, false);
             amanager.setStreamMute(AudioManager.STREAM_SYSTEM, false);

1
很遗憾,自API 22级以后已被弃用。 - Endzeit
2
@Endzeit:请参考@Lokanath的答案。对于最近的Android版本,只需将adjustStreamVolume()调用替换为ADJUST_MUTE即可。 - fadden

23

所提供的答案似乎从Android M(API 23)开始已经过时,因此这里提供了替代方案。

public void MuteAudio(){
    AudioManager mAlramMAnager = (AudioManager) aActivity.getSystemService(aContext.AUDIO_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        mAlramMAnager.adjustStreamVolume(AudioManager.STREAM_NOTIFICATION, AudioManager.ADJUST_MUTE, 0);
        mAlramMAnager.adjustStreamVolume(AudioManager.STREAM_ALARM, AudioManager.ADJUST_MUTE, 0);
        mAlramMAnager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_MUTE, 0);
        mAlramMAnager.adjustStreamVolume(AudioManager.STREAM_RING, AudioManager.ADJUST_MUTE, 0);
        mAlramMAnager.adjustStreamVolume(AudioManager.STREAM_SYSTEM, AudioManager.ADJUST_MUTE, 0);
    } else {
        mAlramMAnager.setStreamMute(AudioManager.STREAM_NOTIFICATION, true);
        mAlramMAnager.setStreamMute(AudioManager.STREAM_ALARM, true);
        mAlramMAnager.setStreamMute(AudioManager.STREAM_MUSIC, true);
        mAlramMAnager.setStreamMute(AudioManager.STREAM_RING, true);
        mAlramMAnager.setStreamMute(AudioManager.STREAM_SYSTEM, true);
    }
}

public void UnMuteAudio(){
    AudioManager mAlramMAnager = (AudioManager) aActivity.getSystemService(aContext.AUDIO_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        mAlramMAnager.adjustStreamVolume(AudioManager.STREAM_NOTIFICATION, AudioManager.ADJUST_UNMUTE, 0);
        mAlramMAnager.adjustStreamVolume(AudioManager.STREAM_ALARM, AudioManager.ADJUST_UNMUTE, 0);
        mAlramMAnager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_UNMUTE,0);
        mAlramMAnager.adjustStreamVolume(AudioManager.STREAM_RING, AudioManager.ADJUST_UNMUTE, 0);
        mAlramMAnager.adjustStreamVolume(AudioManager.STREAM_SYSTEM, AudioManager.ADJUST_UNMUTE, 0);
    } else {
        mAlramMAnager.setStreamMute(AudioManager.STREAM_NOTIFICATION, false);
        mAlramMAnager.setStreamMute(AudioManager.STREAM_ALARM, false);
        mAlramMAnager.setStreamMute(AudioManager.STREAM_MUSIC, false);
        mAlramMAnager.setStreamMute(AudioManager.STREAM_RING, false);
        mAlramMAnager.setStreamMute(AudioManager.STREAM_SYSTEM, false);
    }
}

希望这可以帮到您...


完美的解决方案!!如果您保持单个方法静音/取消静音标志参数,那就更好了,但这是可选的 :)。 - Pankaj Kumar

11

Android有四种声音设置:

  • 闹钟
  • 音乐
  • 铃声
  • 通知

首先,创建一个AudioManager类对象:

AudioManager amanager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);

如果您想要设置音量,请使用以下内容:

对于通知

amanager.setStreamVolume(AudioManager.STREAM_NOTIFICATION,
    AudioManager.FLAG_SHOW_UI + AudioManager.FLAG_PLAY_SOUND);

提醒功能

amanager.setStreamVolume(AudioManager.STREAM_ALARM,
    AudioManager.FLAG_SHOW_UI + AudioManager.FLAG_PLAY_SOUND);

音乐方面

amanager.setStreamVolume(AudioManager.STREAM_MUSIC,
    AudioManager.FLAG_SHOW_UI + AudioManager.FLAG_PLAY_SOUND);

作为铃声

amanager.setStreamVolume(AudioManager.STREAM_RING,
    AudioManager.FLAG_SHOW_UI + AudioManager.FLAG_PLAY_SOUND);

2
实际上不是有更多的流(系统、语音通话)吗?我在真实设备中看到过这些被使用。另外,没有 AudioManager#setStreamVolume(int, int) 方法,只存在一个接受三个参数的方法(其中一个是要设置的音量)。你可以传递 0,但并不是所有流都接受它。 - Tom
这个答案中没有提供类似的方法。 - Zar E Ahmer

4
mAlramMAnager.adjustStreamVolume(AudioManager.STREAM_NOTIFICATION, AudioManager.ADJUST_TOGGLE_MUTE, 0);
mAlramMAnager.adjustStreamVolume(AudioManager.STREAM_ALARM, AudioManager.ADJUST_TOGGLE_MUTE, 0);
mAlramMAnager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_TOGGLE_MUTE,0);
mAlramMAnager.adjustStreamVolume(AudioManager.STREAM_RING, AudioManager.ADJUST_TOGGLE_MUTE, 0);
mAlramMAnager.adjustStreamVolume(AudioManager.STREAM_SYSTEM, AudioManager.ADJUST_TOGGLE_MUTE, 0);

4
您可以使用 setRingerMode() 方法来实现这一点。
AudioManager audioManager=(AudioManager)getSystemService(AUDIO_SERVICE);
audioManager.setRingerMode(audioManager.RINGER_MODE_SILENT);

静音和震动:RINGER_MODE_VIBRATE 标志

取消静音:RINGER_MODE_NORMAL


3

从技术上讲,不存在全局音量这样的东西。Bhargav的回答应该可以帮助你找到正确的方法。AudioManager类可以控制许多不同的“流”,包括音乐、响铃、通话、闹钟、通知、系统和DMTF。您必须将所有这些单独流的音量设置为0,这是一个非常简单的过程,如Bhargav所示。

只需创建一个AudioManager对象:

AudioManager audioManager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);

接下来,使用它来更改所有流的音量:

audioManager.setStreamVolume(AudioManager.Stream, Extra Flags or null);

不要直接输入 AudioManager.Stream,而是输入 "AudioManager." 并按下 Ctrl+Space Bar 查看可以使用的所有不同流。查看文档以了解可以添加声音或振动或在音量更改时打开音量 UI 的许多不同类型的标志。

每个流可能具有不同的最大音量,因此请确保使用 getMaxStreamVolume 获取最大值并相应地设置音量,以防您正在使用单个值来编辑所有流。因此,如果用户想将全局音量设置为 50%,则获取每个流的最大音量,将其乘以 0.5,并将其设置为相应的流。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接