Android 应用在显示 android.widget.MediaController 时无法识别音量键按下

Android app not recognising volume key presses when showing android.widget.MediaController

我无法让 Android 应用程序(Android 6.0 上的 运行)在显示 android.widget.MediaController 时响应音量键按下。

当点击片段中的按钮时,媒体控制器由片段显示。

已经加载片段的activity在onCreate中有如下代码:

AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);        
this.setVolumeControlStream(AudioManager.STREAM_MUSIC);

当媒体控制器未显示时,按下音量键会调整音量,并且此音量调整会影响媒体控制器播放声音的音量。

但是,当媒体控制器在应用程序中显示可见时,音量键将被忽略。我已经重写了 activity 的 onKeyDown 方法来检测按键何时被识别,只有当媒体控制器不可见时它们才会被识别。

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    switch (keyCode) {
    case KeyEvent.KEYCODE_VOLUME_UP:
        Log.i(TAG, "Increased volume");
        getAudioManager().adjustStreamVolume(AudioManager.STREAM_MUSIC,
                AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);
        return true;
    case KeyEvent.KEYCODE_VOLUME_DOWN:
        Log.i(TAG, "Decreased volume");
        getAudioManager().adjustStreamVolume(AudioManager.STREAM_MUSIC,
                AudioManager.ADJUST_LOWER, AudioManager.FLAG_SHOW_UI);
        return true;
    default:
        return false;
    }
}

当听到声音时,用户往往会想要调节音量,而这恰恰是他们无法调节音量的时候,事情就是这样。如何更改媒体控制器的行为以使其识别音量键按下?

昨天遇到这个问题,偶然发现了你的问题。我知道它很旧,您可能已经找到了解决方法,但我想我应该 post 一个答案,以防其他人在这里找到他们的方法。

你最初的想法很有帮助,但我没有为我的 activity 重写 KeyEvents 的处理程序,而是为 MediaController.

重写了处理程序

我所做的是覆盖 public boolean dispatchKeyEvent(KeyEvent event) 并像这样初始化我的 MediaController 对象:

        mediaControls = new MediaController(this) {

            @Override
            public boolean dispatchKeyEvent(KeyEvent event) {
                int action = event.getAction();
                int keyCode = event.getKeyCode();
                switch (keyCode) {
                    case KeyEvent.KEYCODE_VOLUME_UP:
                        if (action == KeyEvent.ACTION_DOWN) {
                            audioManager.adjustVolume(AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);
                        }
                        break;
                    case KeyEvent.KEYCODE_VOLUME_DOWN:
                        if (action == KeyEvent.ACTION_DOWN) {
                            audioManager.adjustVolume(AudioManager.ADJUST_LOWER, AudioManager.FLAG_SHOW_UI);
                        }
                        break;
                    default:
                        return super.dispatchKeyEvent(event);
                }
                return true;
            }
        };

audioManager 是我的 Activity 中的私有成员,其创建方式与上述问题相同。

希望这会对某人有所帮助。

祝你工作愉快!