我正在开发一款根据特定间隔播放声音的应用。而且我让用户控制那些音量音量。现在告诉它没问题,音量等级是用户之前选择的。但这里的问题是设备音量水平也发生了变化。 问题是:如何在不影响设备声级的情况下以音量级别播放声音?
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();
更新:根据Biraj解决方案 要获取每个设备的最大允许容量,请使用 int streamMaxVolume 而不是 MAX_VOLUME 变量。 所以完整的答案是:
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);
}
答案 0 :(得分:3)
请勿AudioManager
使用setVolume
。使用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);
}
说明:
setVolume (float leftVolume, float rightVolume)
设置此播放器的音量。建议使用此API来平衡应用程序中音频流的输出。除非您正在编写用于控制用户设置的应用程序,否则应优先使用此API,以设置特定类型的所有流的卷的setStreamVolume(int,int,int)。请注意,传递的卷值是0.0到1.0范围内的原始标量。 UI控件应该以对数方式进行缩放。
参数
leftVolume留下音量标量
rightVolume右卷标量
有关详细信息,请访问HERE