在安卓系统中如何调整媒体音量?

55

我可以更改媒体音量吗?如何更改?到目前为止,我使用了这个:

setVolumeControlStream(AudioManager.STREAM_MUSIC);

我有一个进度条,并想改变媒体音量,而不是铃声音量。

所以,有人能向我展示如何在onCreate()中仅更改媒体音量,然后我稍后再修复进度条吗?


我也使用这种方法。但是,我无法从我的SurfaceView中调用以下方法: context.setVolumeControlStream(AudioManager.STREAM_MUSIC) 我不能将“context”替换为“this”,因为我不在Activity中... 有什么提示吗? - user3833732
我想在来电时只静音铃声而不播放视频。我该如何解决这个问题?我的小米手机出现了问题... - Sagar
5个回答

92

正确使用的方法是在您的AudioManager上使用setStreamVolume。代码示例如下:

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

audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,
                             [int value],
                             [if desired a flag]);

一个示例使用该标志的方法是在设置音量时获取蜂鸣声,以便用户可以听到结果。对应的标志是AudioManager.FLAG_PLAY_SOUND

如果你不想播放声音而是要显示当前值的toast,则可以使用AudioManager.FLAG_SHOW_UI标志。使用者必须得到反馈,无论是听觉还是视觉。

要获取给定流的最大有效值,只需在AudioManager上调用getStreamMaxVolume(),然后获得一个整数,该整数表示……好吧,是音量的最大有效值。


我不想要任何声音,如果我移除标志会出现错误。 - carefacerz
在输入[int value]时,可能的值是什么? - carefacerz
这需要任何权限吗? - wutzebaer
嗨,我正在尝试在我的应用程序中创建一个静音和取消静音按钮。我希望取消静音设置为用户进入应用程序之前的音量。我尝试使用您的解释,但遇到了一个问题:http://stackoverflow.com/questions/33589116/the-audio-volume-is-zero?noredirect=1#comment54954950_33589116 - Ruchir Baronia
@wutzebaer 没有。但是有一个叫做“MODIFY_AUDIO_SETTINGS”的权限,有点奇怪... - android developer

40
private AudioManager audio;

在 onCreate 方法内:

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

重写 onKeyDown:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    switch (keyCode) {
    case KeyEvent.KEYCODE_VOLUME_UP:
        audio.adjustStreamVolume(AudioManager.STREAM_MUSIC,
                AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);
        return true;
    case KeyEvent.KEYCODE_VOLUME_DOWN:
        audio.adjustStreamVolume(AudioManager.STREAM_MUSIC,
                AudioManager.ADJUST_LOWER, AudioManager.FLAG_SHOW_UI);
        return true;
    default:
        // return false;
        // Update based on @Rene comment below:
        return super.onKeyDown(keyCode, event);
    }
}

11
功能正常,但默认情况下应返回super.onKeyDown(keyCode, event);否则将失去返回键以结束应用程序,例如。 - Rene
2
非常正确…我可能也注意到了,但是为了示例而排除了它,然后因为轨迹球的滚动问题而保留了false。 - Anthony Graglia
请注意,adjustStreamVolume和其他方法的文档中指出:“此方法仅适用于替换音频设置的平台范围管理或主要电话应用程序的应用程序。” https://developer.android.com/reference/android/media/AudioManager.html#adjustStreamVolume(int,%20int,%20int) - TalkLittle
@trgraglia:连接到我的音频插槽的外部耳机的音量设置是否需要特殊的API调用? - vgokul129

11

您可以使用以下代码来使用SeekBar处理音量:

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

SeekBar sbVolumeBooster = (SeekBar) findViewById(R.id.sbVolumeBooster);
sbVolumeBooster.setMax(audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)); 
sbVolumeBooster.setProgress(audioManager.getStreamVolume(AudioManager.STREAM_MUSIC));  

sbVolumeBooster.setOnSeekBarChangeListener(new OnSeekBarChangeListener() 
{
    @Override
    public void onStopTrackingTouch(SeekBar arg0) 
    {
    }

    @Override
    public void onStartTrackingTouch(SeekBar arg0) 
    {
    }

    @Override
    public void onProgressChanged(SeekBar arg0, int progress, boolean arg2) 
    {
        audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,
                progress, 0);  // 0 can also be changed to AudioManager.FLAG_PLAY_SOUND
    }
});

1
这是编程上正确的可接受答案,可以实现声音变化。 - Anand Savjani

5

在标志中给出0可以避免获得视觉和音频指示器。当您实现自己的音频条和指示器时,这是很好的选择,因为您不希望Android添加任何内容。


1

老实说,我不确定,但这是可能的标志列表:http://developer.android.com/reference/android/media/AudioManager.html#FLAG_ALLOW_RINGER_MODES 您也可以尝试给它一个数字,比如0,这个数字没有用于任何标志。这可能表示不使用任何标志。 - Computerish
0 表示没有标志。 - Abandoned Cart

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