音频管理AudioManager使用

Posted by alonealice on 2020-10-31

AudioManager主要是用来控制声音的音量和响铃模式。

获取音量

获取AudioManager:

1
2
//获取系统的Audio管理者
AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

可以调节音量的声音分类:

  • STREAM_VOICE_CALL:通话声音
  • STREAM_SYSTEM:系统声音,包括按键声音等
  • STREAM_RING:来电响铃
  • STREAM_MUSIC:媒体声音(包括音乐,视频,游戏声音)
  • STREAM_ALARM:闹钟声音
  • STREAM_NOTIFICATION:通知声音

获取对应的音量:

1
2
3
4
5
6
7
8
//最大音量
int maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
//最小音量
int maxVolume = mAudioManager.getStreamMinVolume(AudioManager.STREAM_MUSIC);
//当前音量
int currentVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
//对应输出设备的音量
mAudioManager.getStreamVolumeDb(AudioManager.STREAM_MUSIC, 0,TYPE_BUILTIN_SPEAKER);

控制音量

音量控制有两种方式:

一种是渐进式,即像手动按音量键一样,一步一步增加或减少,并通过AudioManager的adjustStreamVolume方法:

1
2
3
4
5
6
7
8
9
public void adjustStreamVolume(int streamType, int direction, int flags) {
final IAudioService service = getService();
try {
service.adjustStreamVolume(streamType, direction, flags,
getContext().getOpPackageName());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}

streamType:需要调整的音量类型

direction:调整的方向,加或者减。

1
2
3
ADJUST_LOWER 降低音量
ADJUST_RAISE 升高音量
ADJUST_SAME 保持不变,这个主要用于向用户展示当前的音量

flags:附加的一些参数

1
2
3
FLAG_PLAY_SOUND 调整音量时播放声音
FLAG_SHOW_UI 调整时显示音量条,就是按音量键出现的那个
0表示什么也没有

二是直接自定义调节的幅度,使用setStreamVolume方法:

1
2
3
4
5
6
7
8
public void setStreamVolume(int streamType, int index, int flags) {
final IAudioService service = getService();
try {
service.setStreamVolume(streamType, index, flags, getContext().getOpPackageName());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}

index: 把音量调整到index值

设置声音模式

声音模式主要有3类:

  • RINGER_MODE_NORMAL:正常模式
    所有声音都正常,包括系统声音,来电响铃,媒体声音,闹钟,通知声音都有
  • RINGER_MODE_SILENT:静音模式
    该模式下,来电响铃,通知,系统声音和震动都没有;闹钟,通话声音保持;大部分手机媒体声音依然有,但是小米和少部分oppo手机在设置静音的同时会将媒体声音自动调整为0,此时没有媒体声音
  • RINGER_MODE_VIBRATE:震动模式
    该模式下,来电,通知保持震动没有声音;但是媒体,闹钟依然有声音。不过小米手机只有正常模式和静音模式,没有震动模式

设置声音模式的方法主要是setRingerMode和getRingerMode:

1
2
3
4
5
6
7
8
9
10
11
public void setRingerMode(int ringerMode) {
if (!isValidRingerMode(ringerMode)) {
return;
}
final IAudioService service = getService();
try {
service.setRingerModeExternal(ringerMode, getContext().getOpPackageName());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}

同时在声音模式改版之后,会受到系统广播,其action = RINGER_MODE_CHANGED_ACTION,extra = EXTRA_RINGER_MODE。

其他控制

  • setSpeakerphoneOn(boolean on):控制扬声器开或者关
  • isSpeakerphoneOn():判断当前扬声器是开还是关
  • setMicrophoneMute(boolean on):设置麦克风静音开或者关
  • isMicrophoneMute():判断麦克风是否静音
  • isWiredHeadsetOn():检查是否插入耳机