如何在Android应用程序中合理地管理音频音量?

如何在Android应用程序中合理地管理音频音量?,android,Android,我有一个应用程序,在其活动打开时播放间歇性声音,用户总是希望它发出这些噪音,但不幸的是,它受到音乐流音量的限制。因此,我发现的选择是: 调整音乐流的音量,如果用户碰巧正在播放音乐,可能会震耳欲聋 调用MediaPlayer.setVolume(),如果音乐流的音量为0,则该函数无效 处理音量按钮按下自己,这会出现两个问题:音量按钮按下会调整振铃器音量,除非我的音频正在播放,而我至今无法使用OnKeyListener捕捉音量按钮按下的onKey事件。如果有什么方法可以在我的活动有焦点时强制调整应用

我有一个应用程序,在其活动打开时播放间歇性声音,用户总是希望它发出这些噪音,但不幸的是,它受到音乐流音量的限制。因此,我发现的选择是:

  • 调整音乐流的音量,如果用户碰巧正在播放音乐,可能会震耳欲聋
  • 调用MediaPlayer.setVolume(),如果音乐流的音量为0,则该函数无效
  • 处理音量按钮按下自己,这会出现两个问题:音量按钮按下会调整振铃器音量,除非我的音频正在播放,而我至今无法使用OnKeyListener捕捉音量按钮按下的onKey事件。如果有什么方法可以在我的活动有焦点时强制调整应用到音乐流,或者只是抓住自己按下的按钮,那么这就行了
  • 在背景中播放一段无声的循环音频,使音乐流保持在背景中,以便进行音量调整

  • 我认为第三个选项可能是最好的,因为它将卷的控制权让给了用户,但如果有某种方法可以在一个mediaplayer实例中覆盖系统卷,这也会起作用。

    通过Google Group获得了另一个建议,这是我一直在寻找的平台集成解决方案,效果很好:

    请不要处理音量键 你自己——这几乎是不可能的 保证你不会弄坏这个盒子 音量键的行为

    在onCreate()中调用此API:

    setVolumeControlStream(AudioManager.STREAM_MUSIC)

    这会告诉AudioManager 您的应用程序具有焦点,即卷 按键可以调节音乐音量


    这个API很有用:setVolumeControlStream(AudioManager.STREAM_MUSIC)


    除非这样,否则我将花费更多的时间来修复该卷错误。

    如果您有活动的override onKeyDown(int-keycode,KeyEvent-event)方法,这对您没有帮助。

    如果您使用的是“onKeyDown”方法,您可以通过执行以下操作来解决此问题:

    public boolean onKeyDown(int keyCode, KeyEvent event) {    
    if (keyCode == KeyEvent.KEYCODE_VOLUME_UP || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
                    setVolumeControlStream(AudioManager.STREAM_MUSIC);}}
    

    啊!谢谢,老兄,我也有同样的问题(就像白痴花了2个小时调试我的声音播放代码…)谢谢。通过谷歌搜索很难找到这个。见鬼,官方android开发论坛上的人说要抓取音量键。我也认为这是个坏主意,所以谢谢你找到这个。@Luke谢谢。这就是我要找的。如果你正在使用MediaPlayer,你可以这样设置:MediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);感谢它的工作只是前景。我想在应用程序处于后台时处理流音乐的音量。请让我知道任何解决方案。请在此处查看此答案,而此代码可能会回答此问题,并提供有关如何和/或为什么解决此问题的其他上下文,以提高答案的长期价值。
       var audioManager:AudioManager?=null
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            registerReceiver(mVolumeReceiver, IntentFilter("android.media.VOLUME_CHANGED_ACTION"))
            audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
        }
    
        private var mVolumeReceiver: BroadcastReceiver = object : BroadcastReceiver() {
            override fun onReceive(context: Context, intent: Intent) {
    
                if (intent.action == "android.media.VOLUME_CHANGED_ACTION") {
                    var currentVolume = audioManager?.getStreamVolume(AudioManager.STREAM_MUSIC)
                }
            }
        }