Приложение Android не распознает нажатия клавиш громкости при отображении android.widget.MediaController

Я не могу заставить приложение Android (работающее на Android 6.0) реагировать на нажатия клавиш громкости, когда отображается android.widget.MediaController.

Контроллер мультимедиа показан фрагментом при нажатии кнопки во фрагменте.

Активность, которая загрузила фрагмент, имеет следующий код в onCreate:

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

Когда медиа-контроллер не отображается, нажатие клавиши громкости регулирует громкость, и эта регулировка громкости влияет на громкость, с которой звук воспроизводится медиа-контроллером.

Однако, когда медиа-контроллер отображается в приложении, клавиши регулировки громкости игнорируются. Я переопределил метод 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;
    }
}

Пользователи, как правило, хотят регулировать громкость, когда звук слышен, и именно тогда они не могут регулировать громкость, как все работает. Как можно изменить поведение медиаконтроллера, чтобы он распознавал нажатия клавиш громкости?


person Geoff S    schedule 02.02.2016    source источник


Ответы (1)


Вчера столкнулся с этой проблемой и наткнулся на ваш вопрос. Я знаю, что он довольно старый, и вы, вероятно, нашли способ обойти его, но я подумал, что должен опубликовать ответ на случай, если кто-то еще найдет здесь свой путь.

Ваша первоначальная идея очень помогла, но вместо переопределения обработчика 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 и создается так же, как и в вопросе выше.

Надеюсь, это поможет кому-то.

Продуктивного дня!

person ValB2wsa1    schedule 04.07.2017