调整Android的AudioManager音量级别

7

我知道对于一些人来说,这可能是一个简单或者愚蠢的问题,但是我似乎无法理解,如何通过百分比进行音量调节,比如将其设置为70%?我知道我必须使用以下方法获取最大流量音量:

 int streamMaxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_RING);

我们可以使用以下方法来设置:

    audioManager.setStreamVolume(AudioManager.STREAM_RING, streamMaxVolume);

但是如何使用百分比进行设置呢?非常感谢您的回答,谢谢。


1
请尝试使用此链接中的解决方案:https://dev59.com/zmsy5IYBdhLWcg3w6iJZ#53774373 - Hitesh sapra
2个回答

27

这应该可以工作

AudioManager audio = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
int currentVolume = audio.getStreamVolume(AudioManager.STREAM_MUSIC);
int maxVolume = audio.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
float percent = 0.7f;
int seventyVolume = (int) (maxVolume*percent);
audio.setStreamVolume(AudioManager.STREAM_MUSIC, seventyVolume, 0);

1

大家好,这是2022年!

我的文字游戏应用中,我们的方法不是触碰AudioManager!

这意味着我从未调用以下代码:

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

原因是如果用户尝试更改应用程序中的声音音量,但电话和音乐的总体音量也会改变,她会感到不愉快。

因此,我只需将0.1到1.0之间的因子值保存到共享首选项中,然后在播放游戏中的任何声音时将整体电话音量乘以该因子。

在我的应用程序的设置片段中,我有一个材料滑块:

<com.google.android.material.slider.Slider
    android:id="@+id/volumeFactorSlider"
    android:layout_weight="8"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:contentDescription="Volume"
    android:valueFrom="0.1"
    android:valueTo="1.0" />

app screenshot

@Override
public View onCreateView(@NonNull LayoutInflater inflater,
                         ViewGroup container,
                         Bundle savedInstanceState) {

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(requireContext());
    View v = inflater.inflate(R.layout.fragment_settings, container, false);
    Slider volumeFactorSlider = v.findViewById(R.id.volumeFactorSlider);
    float volumeFactor = prefs.getFloat(KEY_VOLUME, 1.0f);
    // clamp the value read from shared prefs to avoid IllegalStateException
    volumeFactor = Math.max(volumeFactorSlider.getValueFrom(), volumeFactor);
    volumeFactor = Math.min(volumeFactor, volumeFactorSlider.getValueTo());
    volumeFactorSlider.setValue(volumeFactor);
    volumeFactorSlider.addOnSliderTouchListener(new Slider.OnSliderTouchListener() {
        @Override
        public void onStartTrackingTouch(@NonNull Slider slider) {
            // ignore
        }

        @Override
        public void onStopTrackingTouch(@NonNull Slider slider) {
            prefs.edit().putFloat(KEY_VOLUME, slider.getValue()).apply();
        }
    });

    return v;
}

在播放声音的游戏片段中,我使用以下代码:


private SoundPool mSoundPool;
private float mVolumeFactor;
private int mShuffleSound;
private int mBonusSound;

@Override
public View onCreateView(@NonNull LayoutInflater inflater,
                         ViewGroup container,
                         Bundle savedInstanceState) {

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(requireContext());
    mVolumeFactor = prefs.getFloat(KEY_VOLUME, 1.0f);

    mSoundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 0);
    mShuffleSound = mSoundPool.load(requireContext(), R.raw.shuffle, 1);
    mBonusSound = mSoundPool.load(requireContext(), R.raw.magic, 1);
    ....
}

@Override
public void onDestroy() {
    super.onDestroy();
    mSoundPool.release();
    mSoundPool = null;
}

最后,当播放声音时,我只需乘以这个因子:
private void playSound(int soundId) {
    mSoundPool.play(soundId, mVolumeFactor, mVolumeFactor, 1, 0, 1f);
}

例如,在洗牌字母块的时候: playSound(mShuffleSound);

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