效果
修改系統音量
這種操作還是挺常見的,一般在多媒體
開發中都多少會涉及到。
常用方法
獲取音訊管理器
mAudioManager = this.getSystemService(Context.AUDIO_SERVICE) as AudioManager
複製程式碼
獲取媒體音量最大值
mMaxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)
複製程式碼
獲取系統當前媒體音量
mCurrentVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC)
複製程式碼
這裡涉及到幾個常見音量型別
:
- STREAM_VOICE_CALL 通話
- STREAM_SYSTEM 系統
- STREAM_RING 鈴聲
- STREAM_MUSIC 媒體音量
- STREAM_ALARM 鬧鐘
- STREAM_NOTIFICATION 通知
獲取系統音量模式
mAudioManager.ringerMode
複製程式碼
音量模式:
- RINGER_MODE_NORMAL 正常
- RINGER_MODE_SILENT 靜音
- RINGER_MODE_VIBRATE 震動
設定系統媒體音量
來看一下是如何修改音量的
btn_add.setOnClickListener {
if (mCurrentVolume < mMaxVolume) {
mCurrentVolume++
} else {
mCurrentVolume = mMaxVolume
}
updateNum(mCurrentVolume)
setStreamVolume(mCurrentVolume)
}
btn_reduce.setOnClickListener {
if (mCurrentVolume > 0) {
mCurrentVolume--
} else {
mCurrentVolume = 0
}
updateNum(mCurrentVolume)
setStreamVolume(mCurrentVolume)
}
複製程式碼
注意,這裡要判斷一下是否超出了音量的最大值最小值。
在事件中,除了判斷最大值最小值之外,還呼叫了兩個方法
updateNum
更新頁面顯示:
/**
* 更新頁面顯示
*/
private fun updateNum(volume: Int) {
tv_volume.text = volume.toString()
seekBar.progress = volume
}
複製程式碼
還呼叫了setStreamVolume
方法,這裡就涉及到setStreamVolume
和adjustStreamVolume
的區別:
- setStreamVolume 直接設定音量,指哪打哪
- adjustStreamVolume 步長式設定音量,即10,20,30這樣階梯式
二者都可以設定音量,可以根據自己的業務需求來選擇。
setStreamVolume
來看一下具體的setStreamVolume
方法:
private fun setStreamVolume(volume: Int) {
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, volume, AudioManager.FLAG_SHOW_UI)
}
複製程式碼
- 引數1:音量型別
- 引數2:音量數值
- 引數3:
- AudioManager.FLAG_SHOW_UI 調整音量時顯示系統音量進度條 , 0 則不顯示
- AudioManager.FLAG_ALLOW_RINGER_MODES 是否鈴聲模式
- AudioManager.FLAG_VIBRATE 是否震動模式
- AudioManager.FLAG_SHOW_VIBRATE_HINT 震動提示
- AudioManager.FLAG_SHOW_SILENT_HINT 靜音提示
- AudioManager.FLAG_PLAY_SOUND 調整音量時播放聲音
adjustStreamVolume
音量遞增
private fun adjustRaise() {
mAudioManager.adjustStreamVolume(
AudioManager.STREAM_MUSIC,
AudioManager.ADJUST_RAISE,
AudioManager.FLAG_SHOW_UI
)
}
複製程式碼
- 引數1:音量型別
- 引數2:音量調整方向
- AudioManager.ADJUST_RAISE 音量逐漸遞增
- AudioManager.ADJUST_LOWER 音量逐漸遞減
- AudioManager.ADJUST_SAME 不變
- 引數3:同setStreamVolume引數3
音量遞減
private fun adjustLower(volume: Int) {
mAudioManager.adjustStreamVolume(
AudioManager.STREAM_MUSIC,
AudioManager.ADJUST_LOWER,
AudioManager.FLAG_SHOW_UI
)
}
複製程式碼
Github: github.com/yechaoa/Bri…
監聽音量控制按鍵
除了我們手動去改之外,使用者也可以通過物理按鍵
或是耳機
來控制音量,這時,我們理應也要做出相應的改變,所以,還需要對音量按鍵做監聽才行。
這裡就用到熟悉的老方法了,重寫Activity
的onKeyDown
方法:
/**
* 監聽並接管系統的音量按鍵,
* 注意:最好保持原有邏輯不變
*/
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
when (keyCode) {
//音量+按鍵
KeyEvent.KEYCODE_VOLUME_UP -> {
if (mCurrentVolume < mMaxVolume) {
mCurrentVolume++
} else {
mCurrentVolume = mMaxVolume
}
updateNum(mCurrentVolume)
setStreamVolume(mCurrentVolume)
return true
}
//音量-按鍵
KeyEvent.KEYCODE_VOLUME_DOWN -> {
if (mCurrentVolume > 0) {
mCurrentVolume--
} else {
mCurrentVolume = 0
}
updateNum(mCurrentVolume)
setStreamVolume(mCurrentVolume)
return true
}
}
return super.onKeyDown(keyCode, event)
}
複製程式碼
其實很簡單,攔截事件,然後執行我們的邏輯就行了。
總結
總的來說,程式碼量並不多,難度係數也不高,唯一要注意的是各個引數的型別,要根據自己的實際業務來選擇即可。
ok,至此關於修改音量
的講解就全部結束了,如果對你有用,就點個贊吧^ - ^