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中并没有提供来电振动的方法,但是在系统的音量设置界面可以看到有这个选项。

vibrate_when_ring

Android 5.1.0系统截图

通过分析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出来了 :)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐