Android 修改系統音量及監聽

語言: CN / TW / HK

效果

在這裡插入圖片描述

修改系統音量這種操作還是挺常見的,一般在多媒體開發中都多少會涉及到。

常用方法

獲取音訊管理器

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方法,這裡就涉及到setStreamVolumeadjustStreamVolume的區別:

  • 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…

監聽音量控制按鍵

除了我們手動去改之外,使用者也可以通過物理按鍵或是耳機來控制音量,這時,我們理應也要做出相應的改變,所以,還需要對音量按鍵做監聽才行。

這裡就用到熟悉的老方法了,重寫ActivityonKeyDown方法:

    /**
     * 監聽並接管系統的音量按鍵,
     * 注意:最好保持原有邏輯不變
     */
    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,至此關於修改音量的講解就全部結束了,如果對你有用,就點個贊吧^ - ^

Github

github.com/yechaoa/Bri…