Leebeedev
Leebeedev

Reputation: 2146

Play sound with my volume settings

I'm developing an app that plays some sound according to specific intervals. And I'm letting the user control those sounds volume levels. Tell now it's OK and the sound volume level is as the user selected before. But the problem here that the device volume levels changed too. The QUESTION is: How to play my sounds at my volume level without affecting the device sound levels?

defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
int streamMaxVolume = mAudioManager.getStreamMaxVolume(3);
vol = defaultSharedPreferences.getInt("vol_one", streamMaxVolume);
mAudioManager.setStreamVolume(3, vol, 0);
playsound();

Update: according to Biraj solution to get the max allowed volume for each device use the int streamMaxVolume instead of the MAX_VOLUME variable. so the full answer is:

AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
int streamMaxVolume = mAudioManager.getStreamMaxVolume(3);
vol = defaultSharedPreferences.getInt("vol_one", streamMaxVolume);
setVolume(vol);
*
*
*
public void setVolume(int soundVolume){
    final float volume = (float) (1 - (Math.log(streamMaxVolume- soundVolume) /    Math.log(streamMaxVolume)));
    mediaPlayer.setVolume(volume, volume);
}

Upvotes: 0

Views: 1581

Answers (1)

Biraj Zalavadia
Biraj Zalavadia

Reputation: 28484

Don't use AudioManager to setVolume. Use MediaPlayer.setVoume()

private final static int MAX_VOLUME = 100;



public void setVolume(int soundVolume){
        final float volume = (float) (1 - (Math.log(MAX_VOLUME - soundVolume) / Math.log(MAX_VOLUME)));
        mediaPlayer.setVolume(volume, volume);
    }

EXPLANATION :

setVolume (float leftVolume, float rightVolume)

Sets the volume on this player. This API is recommended for balancing the output of audio streams within an application. Unless you are writing an application to control user settings, this API should be used in preference to setStreamVolume(int, int, int) which sets the volume of ALL streams of a particular type. Note that the passed volume values are raw scalars in range 0.0 to 1.0. UI controls should be scaled logarithmically.

Parameters

leftVolume left volume scalar

rightVolume right volume scalar

For more information visit HERE

Upvotes: 3

Related Questions