gpt4 book ai didi

android - 如何管理 MediaPlayer.setVolume() + SeekBar 来设置它 + 设备音量控制

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:58:46 35 4
gpt4 key购买 nike

作为recommended by the doc ,我想使用 setvolume() 方法来控制我的 MediaPlayer 的音量,但我对如何管理它有点困惑。

我正在使用 SeekBar 设置音量,初始化为 AudioManager.STREAM_MUSIC 流中的当前音量。

当用户不修改设备音量控制时,这是有道理的,但是当他修改时,我不确定我应该做什么,我有几个疑问:

  • MediaPlayer 音量与设备音量有什么关系? setVolume()中设置的最大值(1)是否对应于mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)

  • 如果是这种情况,每次设置设备音量控制时都应重置 SeekBar 的进度值,但是,使用 MediaPlayer.setVolume 有什么意义() 而不是 AudioManager.setStreamVolume() ?

  • MediaPlayer.setVolume()SeekBar 一起使用的标准方法是什么?

private final static int MAX_VOLUME = 100;
private AudioManager mAudioManager;
private SeekBar mVolumeControl;

mVolumeControl = (SeekBar) getActivity().findViewById(R.id.volume_control);
mAudioManager = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
mVolumeControl.setMax(MAX_VOLUME);
mVolumeControl.setProgress(MAX_VOLUME*mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC)/mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC));
mVolumeControl.setOnSeekBarChangeListener(mVolumeControlChangeListener);

private SeekBar.OnSeekBarChangeListener mVolumeControlChangeListener = new SeekBar.OnSeekBarChangeListener() {

@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

float volume = (float) (1 - (Math.log(MAX_VOLUME - progress) / Math.log(MAX_VOLUME)));
mediaPlayer.setVolume(volume, volume);
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
};

最佳答案

MediaPlayer.setVolume将该播放器的音量设置为该流的总音量的百分比。它不影响流量。因此,如果您只想设置该播放器的音量,请将其设置为介于 0 和 1 之间的值(表示百分比的分数值),并让用户通过使用硬件音量控件单独控制系统音量。连接 SeekBar ,您可以像在示例代码中那样将其缩放 100 倍,因为 SeekBar不支持分数值。哦,还有一件事是为了其他人的利益(因为你已经弄清楚了):文档说“UI 控件应该按对数缩放”,这意味着如果你只是设置音量而不进行任何缩放,音量控件将觉得不自然。基本上,将波幅减半不会被人耳感知为“音量的一半”,因此您需要按对数比例缩放以使人耳感觉更自然,就像您在示例代码中所做的那样。

如果你确实想为给定的流设置系统音量(而不仅仅是给定的播放器),你可以使用 AudioManager.setStreamVolume值介于 0 和 AudioManager.getStreamMaxVolume 返回的值之间.但请记住,那个通常是低分辨率音量控制 - getMaxStreamVolume通常返回一个相对较低的值 - 例如 10 或 15,因此您只有几个可能的交易量头寸。这意味着控制音量不会像控制 MediaPlayer 那样顺畅。的音量直接。此外,显然,以这种方式设置音量会为整个系统设置音量并影响所有应用程序,这可能不是用户想要的。

关于android - 如何管理 MediaPlayer.setVolume() + SeekBar 来设置它 + 设备音量控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18129795/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com