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

时间:2013-08-08 15:16:45

标签: android android-mediaplayer seekbar

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

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

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

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

  • 相对应
  • 如果是这种情况,每次设置设备音量控制时都应重置SeekBar的进度值,但是,使用{的重点是什么{1}}代替AudioManager.setStreamVolume()

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

SeekBar

3 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:1)

添加到TodorK的答案。

我所做的是我最初将StreamVolume设置为Max,并让用户控制SeekBar。完成后,我将StreamVolume设置回原始状态。 这允许用户控制MediaPlayer卷,并且不会影响其他应用程序。

首先将Stream设置为您想要的一个&初始化AudioManager

setVolumeControlStream(AudioManager.STREAM_MUSIC);
audioManager = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);

获取InitialVolume(以便在完成后将其重新设置为此值)并将其设置为MaxVolume

final int initVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
final int maxVolume  = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,maxVolume, 0);

在SeekBarChangedListener的onProgress部分做AudioStuff

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) 
        {
            float volume = (float) (1 - (Math.log(100 - progress) / Math.log(100)));
            mp.setVolume(volume, volume);
            mp.start();
        }

完成后,将其设置回initialVolume,这样用户就不会生气(在我的情况下,即时通讯使用AlertDialog,所以它在onDismiss事件中

        @Override
        public void onDismiss(DialogInterface dialog) 
        {
            audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,initVolume, 0);

            //Stop Playing the Song
            stopSong();             
        }

还要注意,我在onProgress部分

中做了日志

答案 2 :(得分:1)

首先在XML文件中创建一个seekBar。然后复制此代码(seekBar2是seekBar的Id):

private final static int MAX_VOLUME = 100;
SeekBar seekBar = (SeekBar) findViewById(R.id.seekBar2);
seekBar.setOnSeekBarChangeListener(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) {

    }
});