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出來了 :)