AudioManager是Android系統(tǒng)級服務,通過AudioManager可以管理響鈴揣炕,通知,鬧鐘东跪,音樂畸陡,通話,系統(tǒng)等音頻流的音量大小虽填。
音量調(diào)節(jié)
常用的音頻流類型如下:
-
STREAM_RING
:響鈴 -
STREAM_MUSIC
:音樂 -
STREAM_ALARM
:鬧鐘 -
STREAM_VOICE_CALL
:通話 -
STREAM_SYSTEM
:系統(tǒng)(撥號鍵盤提示音丁恭、觸摸提示音、鎖屏提示音) -
STREAM_NOTIFIACTION
:通知
一般情況下斋日,如果需要更改某一個音頻流音量大小牲览,可以通過如下的方式:
//獲得一個AudioManager的實例
final AudioManager audioManager = mContext.getSystemService(Context.ALARM_SERVICE);
//獲得鬧鐘音頻流的最大音量(設(shè)置的音量只能小于最大音量)
final int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM);
//更改鬧鐘音量
audioManager.setStreamVolume(AudioManager.STREAM_ALARM,maxVolume/2,AudioManager.FLAG_PLAY_SOUND);
需要注意的是如果音頻流是固定的,那么調(diào)用上列方法也是無法修改音量的恶守〉谙祝可以調(diào)用 AudioManager
實例的 isVolumeFixed()
方法進行判斷。
同時兔港,setStreamVolume方法還支持一些特定的FLAG值庸毫,使用 |
將不同的模式組合,在設(shè)置音量的時候觸發(fā)押框,例如:AudioManager.FLAG_VIBRATE|AudioManager.FLAG_PLAY_SOUND
設(shè)置時會振動和播放響應的音頻流預覽岔绸。更多的FLAG可以在 AudioManager
類里面查看理逊。
此外橡伞,還有幾個增減音量的方法
-
adjustVolume(int direction, intflags)
:根據(jù)direction(AudioManager.ADJUST_LOWER
,AudioManager.ADJUST_RAISE
)增加盒揉,減少優(yōu)先級高的音頻流的音量。
ps.如果在打電話兑徘,此時通話優(yōu)先級最高刚盈,如果在聽歌,此時音樂流的優(yōu)先級最高 -
adjustStreamVolume(int streamType, int direction, intflags)
:根據(jù)direction值增加挂脑,減少相應的音頻流的音量藕漱。
響鈴模式
STREAM_RING
支持響鈴模式,通過 AudioManager
的 setRingerMode(int mode)
方法可以設(shè)置響鈴模式崭闲, 一共有 RINGER_MODE_SILENT
,RINGER_MODE_VIBRATE
,RINGER_MODE_NORMAL
,RINGER_MODE_MAX
四種模式肋联。
不同響鈴模式作用如下:
- Silent(靜默):靜音,并且不會振動刁俭。
- Vibrate(振動):靜音橄仍,振動
- Normal(普通):響鈴,可能會振動(啟用來電振動選項才會振動)
來電振動
AudioManager中并沒有提供來電振動的方法牍戚,但是在系統(tǒng)的音量設(shè)置界面可以看到有這個選項侮繁。
通過分析Android中的自帶Setting App源代碼,我找到了設(shè)置此選項的方法:
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
類中如孝,是通過調(diào)用 Settings.System.putInt()
方法來設(shè)置此選項值宪哩,通過 Settings.System.getInt()
來得到此選項的值。
在 android.provider.Settings
類中第晰,可以看到 Settings.System.VIBRATE_WHEN_RINGING
的值為 vibrate_when_ringing
锁孟,是一個字符串類型的靜態(tài)常量,但是在代碼中是不能訪問到的但荤。
結(jié)語
通過以上的方式罗岖,基本上就可以自己擼一個情景模式的App出來了 :)