AudioManager是Android系统级服务,通过AudioManager可以管理响铃,通知,闹钟,音乐,通话,系统等音频流的音量大小。
音量调节
常用的音频流类型如下:
-
STREAM_RING
:响铃 -
STREAM_MUSIC
:音乐 -
STREAM_ALARM
:闹钟 -
STREAM_VOICE_CALL
:通话 -
STREAM_SYSTEM
:系统(拨号键盘提示音、触摸提示音、锁屏提示音) -
STREAM_NOTIFIACTION
:通知
一般情况下,如果需要更改某一个音频流音量大小,可以通过如下的方式:
//获得一个AudioManager的实例
final AudioManager audioManager = mContext.getSystemService(Context.ALARM_SERVICE);
//获得闹钟音频流的最大音量(设置的音量只能小于最大音量)
final int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM);
//更改闹钟音量
audioManager.setStreamVolume(AudioManager.STREAM_ALARM,maxVolume/2,AudioManager.FLAG_PLAY_SOUND);
需要注意的是如果音频流是固定的,那么调用上列方法也是无法修改音量的。可以调用 AudioManager
实例的 isVolumeFixed()
方法进行判断。
同时,setStreamVolume方法还支持一些特定的FLAG值,使用 |
将不同的模式组合,在设置音量的时候触发,例如:AudioManager.FLAG_VIBRATE|AudioManager.FLAG_PLAY_SOUND
设置时会振动和播放响应的音频流预览。更多的FLAG可以在 AudioManager
类里面查看。
此外,还有几个增减音量的方法
-
adjustVolume(int direction, intflags)
:根据direction(AudioManager.ADJUST_LOWER
,AudioManager.ADJUST_RAISE
)增加,减少优先级高的音频流的音量。
ps.如果在打电话,此时通话优先级最高,如果在听歌,此时音乐流的优先级最高 -
adjustStreamVolume(int streamType, int direction, intflags)
:根据direction值增加,减少相应的音频流的音量。
响铃模式
STREAM_RING
支持响铃模式,通过 AudioManager
的 setRingerMode(int mode)
方法可以设置响铃模式, 一共有 RINGER_MODE_SILENT
,RINGER_MODE_VIBRATE
,RINGER_MODE_NORMAL
,RINGER_MODE_MAX
四种模式。
不同响铃模式作用如下:
- Silent(静默):静音,并且不会振动。
- Vibrate(振动):静音,振动
- Normal(普通):响铃,可能会振动(启用来电振动选项才会振动)
来电振动
AudioManager中并没有提供来电振动的方法,但是在系统的音量设置界面可以看到有这个选项。
通过分析Android中的自带Setting App源代码,我找到了设置此选项的方法:
Settings.System.putInt(getContentResolver(), Settings.System.VIBRATE_WHEN_RINGING, val ? 1 : 0)
Settings.System.getInt(getContentResolver(), Settings.System.VIBRATE_WHEN_RINGING, 0)
可以看到,在 com.android.settings.notification.NotificationSettings
类中,是通过调用 Settings.System.putInt()
方法来设置此选项值,通过 Settings.System.getInt()
来得到此选项的值。
在 android.provider.Settings
类中,可以看到 Settings.System.VIBRATE_WHEN_RINGING
的值为 vibrate_when_ringing
,是一个字符串类型的静态常量,但是在代码中是不能访问到的。
结语
通过以上的方式,基本上就可以自己撸一个情景模式的App出来了 :)