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

jul*_*jul 8 android seekbar android-mediaplayer

根据文档的建议,我想用这个setvolume()方法来控制我的音量MediaPlayer,但是我对如何管理它有点困惑.

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

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

  • MediaPlayer音量如何与设备音量相关?设置的最大值(1)是否setVolume()对应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) {
    }
};
Run Code Online (Sandbox Code Playgroud)

Tod*_* K. 13

MediaPlayer.setVolume将该播放器的音量设置为该流的总音量的百分比.它不会影响流量.因此,如果您只想设置该播放器的音量,请将其设置为0到1之间的某个值(表示百分比的小数值),并让用户使用硬件音量控件分别控制系统音量.要连接a SeekBar,您可以像在示例代码中那样将其缩放100倍,因为SeekBar它不支持小数值.哦,还有一件让别人受益的事情(因为你已经弄明白了):文档说"UI控件应该按对数比例缩放",这意味着如果你只是设置音量没有任何缩放,音量控制将觉得不自然.基本上,将人体耳朵感知为"体积的一半"不会将波的幅度减半,因此您需要以对数方式进行缩放以使其对人耳感觉更自然,就像您在示例代码中所做的那样.

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