Amazon Fire TV Remote не приостанавливает ExoPlayer, когда элементы управления скрыты

Я работаю над библиотекой Android, которая представляет собой простой видеоплеер, обертывающий ExoPlayer. При использовании Amazon Fire TV я могу перемещаться по своему приложению с помощью пульта дистанционного управления (джойстик переключается между элементами в моем представлении), и я могу управлять проигрывателем (кнопка воспроизведения/паузы переключает состояние воспроизведения, а кнопки поиска работают по назначению) .... пока панель управления видна

Примерно через 3 секунды панель управления автоматически скрывается, а пульт дистанционного управления перестает отвечать на запросы.

Есть ли подходящее решение для этого или мне нужно вручную определять нажатия клавиш на пульте дистанционного управления и отображать панель управления? Я чувствую, что это то, что порт ExoPlayer от Amazon должен был решить.

Обновлять

Я расширил класс PlayerView и переопределил метод dispatchKeyEvent, чтобы увидеть, что было видно:

public class Test extends PlayerView {
    @Override
    public boolean dispatchKeyEvent(KeyEvent event)
    {
        Log.debug("***** KEY EVENT: " + String.valueOf(event.getKeyCode()) + " *********");
        return true;
    }
}

Делая это и нажимая кнопку воспроизведения на пульте, я заметил:

  • Когда панель управления была видна, было отправлено KeyEvent со значением keyCode85.
  • Когда панель управления была скрыта, этот метод никогда не срабатывал

Я просмотрел методы, доступные PlayerView, чтобы увидеть, были ли они полезны, но ничего не показалось стоящим:

  • setControllerAutoShow - определяет, отображается ли панель управления при первом запуске видео
  • setControllerHideDuringAds - определяет, видна ли панель управления во время воспроизведения рекламы
  • setControllerHideOnTouch - неактуально для FireTV (нет сенсорных событий), но скрывает панель управления, если вы коснетесь видео
  • setControllerHideTimeoutMs - может задержать скрытие панели управления, но в противном случае не позволяет мне вернуть ее после того, как она была скрыта
  • showController - может принудительно раскрыть контроллер в коде, что позволяет мне приостановить видео, но я, не имея возможности видеть события нажатия клавиш, не могу правильно вызвать это при нажатии кнопки на пульте дистанционного управления

В конечном счете, я просто хочу, чтобы это вело себя как приложения Netflix или Hulu — панель управления исчезает после нескольких секунд бездействия, но если вы нажмете кнопку паузы, панель управления вернется.

0
0
659
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я нашел ответ, но он не совсем красивый. По какой-то причине (я все еще хочу знать, почему, и если бы кто-то мог объяснить, почему, я бы с радостью принял их ответ вместо своего), когда панель управления исчезает, PlayerView теряет фокус, и события клавиатуры больше не отправляются на нее. Однако все события клавиатуры по-прежнему видны Деятельность, на котором размещается PlayerView. Поэтому я добавил следующее в свою активность:

    @Override
    public boolean dispatchKeyEvent(KeyEvent event)
    {
        playerView.dispatchKeyEvent(event);
        return true;
    }

Теперь независимо от того, видна панель управления или нет, плеер все равно реагирует на все ключевые события. Однако:

  • Это требует редактирования действия, а это означает, что любой, кто использует мою библиотеку проигрывателя, должен знать об этом дополнительном шаге, чтобы правильно интегрировать проигрыватель.
  • Это не объясняет, почему игрок теряет фокус, это просто обходит проблему.

Привет, большое спасибо за этот пост, я попытался использовать это решение в приложении, которое я пишу .... хотя оно, кажется, правильно перехватывает нажатия удаленных клавиш и перенаправляет их в представление игрока (поэтому элементы управления снова появляются ), побочный эффект, который я получаю, заключается в том, что активность больше их не получает.... следовательно, невозможно, например, нажать «назад» и больше выйти из проигрывателя... :-( как вы решили это?

Daniele Muscetta 10.09.2020 11:46

Я отвечаю сам себе: добавление super.dispatchKeyEvent(event) перед возвратом из вашей переопределенной функции, похоже, помогает и отправляет события как игроку, так и активности...

Daniele Muscetta 10.09.2020 12:09

Еще один вопрос по этому поводу: знаете ли вы, можно ли выбирать и «нажимать» кнопки «вперед» и «назад» (с элементами управления видео) в пользовательском интерфейсе? Похоже, что это не так, но эквивалентные физические кнопки на пульте работают. Вы тоже столкнулись с этим ограничением? Спасибо!

Daniele Muscetta 10.09.2020 12:21

@DanieleMuscetta К сожалению, у меня нет ответа на вопрос, можно ли нажимать кнопки «вперед» и «назад». Этот проект был передан другому разработчику, поэтому я больше не работаю над Android SDK и в данный момент у меня нет доступа к AmazonFire.

stevendesu 10.09.2020 20:48

Хорошо, я все равно ценю ответ :-) Я выясню это....

Daniele Muscetta 15.09.2020 12:06
Ответ принят как подходящий

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

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    // this sends them to the playerView but also to the activity - whoever wants it first
    return playerView.dispatchKeyEvent(event) || super.dispatchKeyEvent(event);
}

Другие вопросы по теме