* 音量变化管理器:内部封装对通过系统API获取媒体最大音量,媒体最小音量,通话最大音量,设置通话音量等API的调用,音量变化监听的注册和反注册
public static class VolumeChangeManager {
public static final String VOLUME_CHANGE_ACTION = "android.media.VOLUME_CHANGED_ACTION";
private Context mContext;
private AudioManager mAudioManager;
private VolumeBroadCastReceiver mVolumeBroadCastReceiver;
private int mMediaMaxVolume = 0;
private int mMediaMinVolume = 0;
private int mCallMaxVolume = 0;
private VolumeChangeManager(@NotNull Context context) {
mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
if (mAudioManager == null) {
Logger.e("VolcEngine syncMediaCallVolume mAudioManager is null!");
mMediaMaxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
mMediaMinVolume = mAudioManager.getStreamMinVolume(AudioManager.STREAM_MUSIC);
mCallMaxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL);
mVolumeBroadCastReceiver = new VolumeBroadCastReceiver();
mVolumeBroadCastReceiver.setVolumeChangeManager(this);
context.registerReceiver(mVolumeBroadCastReceiver, new IntentFilter(VOLUME_CHANGE_ACTION));
//首次将通话音量同步至媒体音量,防止本身媒体音量太小
syncMediaCallVolumeWhenInit();
private void syncMediaCallVolumeWhenInit() {
int callVolume = getCallVolume();
int mediaVolume = getMediaVolume();
double callProgress = (double) callVolume / (double)mCallMaxVolume;
double mediaProgress = (double) mediaVolume / (double)mMediaMaxVolume;
if (mediaProgress >= callProgress) {
double progress = callProgress > 0.8 ? 0.8 : callProgress;
int volume = (int)(progress * mMediaMaxVolume);
Logger.i("VolcEngine syncMediaCallVolumeWhenInit volume:" + volume + ", maxVolume:" + mMediaMaxVolume);
private void syncMediaCallVolume() {
int callVolume = getCallVolume();
//按照当前设置的通话音量比例计算应该设置的媒体音量
int volume = (int) ((callVolume / (float) mCallMaxVolume) * mMediaMaxVolume);
private void unregisterVolumeReceiver() {
if (mVolumeBroadCastReceiver != null && mContext != null) {
mContext.unregisterReceiver(mVolumeBroadCastReceiver);
mVolumeBroadCastReceiver.setVolumeChangeManager(null);
mVolumeBroadCastReceiver = null;
private void setMediaVolume(int volume) {
if (mAudioManager != null) {
if (volume > mMediaMaxVolume) {
volume = mMediaMaxVolume;
if (volume < mMediaMinVolume) {
volume = mMediaMinVolume;
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, volume, AudioManager.FLAG_PLAY_SOUND);
private int getCallVolume() {
if (mAudioManager != null) {
return mAudioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL);
private int getMediaVolume() {
if (mAudioManager != null) {
return mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);