写点什么

Android 修改系统音量及监听

作者:yechaoa
  • 2022 年 6 月 20 日
  • 本文字数:2204 字

    阅读完需:约 7 分钟

效果


修改系统音量这种操作还是挺常见的,一般在多媒体开发中都多少会涉及到。

常用方法

获取音频管理器

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: https://github.com/yechaoa/BrightnessAndVolume

监听音量控制按键

除了我们手动去改之外,用户也可以通过物理按键或是耳机来控制音量,这时,我们理应也要做出相应的改变,所以,还需要对音量按键做监听才行。


这里就用到熟悉的老方法了,重写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

https://github.com/yechaoa/BrightnessAndVolume

发布于: 刚刚阅读数: 3
用户头像

yechaoa

关注

优质作者 2018.10.23 加入

知名互联网大厂技术专家,多平台博客专家、优秀博主、人气作者,博客风格深入浅出,专注于Android领域,同时探索于大前端方向,持续研究并落地前端、小程序、Flutter、Kotlin等相关热门技术

评论

发布
暂无评论
Android 修改系统音量及监听_android_yechaoa_InfoQ写作社区