Я работаю над библиотекой 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
со значением keyCode
85
.Я просмотрел методы, доступные PlayerView
, чтобы увидеть, были ли они полезны, но ничего не показалось стоящим:
setControllerAutoShow
- определяет, отображается ли панель управления при первом запуске видеоsetControllerHideDuringAds
- определяет, видна ли панель управления во время воспроизведения рекламыsetControllerHideOnTouch
- неактуально для FireTV (нет сенсорных событий), но скрывает панель управления, если вы коснетесь видеоsetControllerHideTimeoutMs
- может задержать скрытие панели управления, но в противном случае не позволяет мне вернуть ее после того, как она была скрытаshowController
- может принудительно раскрыть контроллер в коде, что позволяет мне приостановить видео, но я, не имея возможности видеть события нажатия клавиш, не могу правильно вызвать это при нажатии кнопки на пульте дистанционного управленияВ конечном счете, я просто хочу, чтобы это вело себя как приложения Netflix или Hulu — панель управления исчезает после нескольких секунд бездействия, но если вы нажмете кнопку паузы, панель управления вернется.
Я нашел ответ, но он не совсем красивый. По какой-то причине (я все еще хочу знать, почему, и если бы кто-то мог объяснить, почему, я бы с радостью принял их ответ вместо своего), когда панель управления исчезает, PlayerView
теряет фокус, и события клавиатуры больше не отправляются на нее. Однако все события клавиатуры по-прежнему видны Деятельность, на котором размещается PlayerView
. Поэтому я добавил следующее в свою активность:
@Override
public boolean dispatchKeyEvent(KeyEvent event)
{
playerView.dispatchKeyEvent(event);
return true;
}
Теперь независимо от того, видна панель управления или нет, плеер все равно реагирует на все ключевые события. Однако:
Я отвечаю сам себе: добавление super.dispatchKeyEvent(event) перед возвратом из вашей переопределенной функции, похоже, помогает и отправляет события как игроку, так и активности...
Еще один вопрос по этому поводу: знаете ли вы, можно ли выбирать и «нажимать» кнопки «вперед» и «назад» (с элементами управления видео) в пользовательском интерфейсе? Похоже, что это не так, но эквивалентные физические кнопки на пульте работают. Вы тоже столкнулись с этим ограничением? Спасибо!
@DanieleMuscetta К сожалению, у меня нет ответа на вопрос, можно ли нажимать кнопки «вперед» и «назад». Этот проект был передан другому разработчику, поэтому я больше не работаю над Android SDK и в данный момент у меня нет доступа к AmazonFire.
Хорошо, я все равно ценю ответ :-) Я выясню это....
Я немного расширил ваше решение, чтобы все элементы управления работали - как у проигрывателя, так и у действия - поскольку было невозможно выйти из действия, а также на разных устройствах, таких как телефоны, было невозможно управлять громкостью управление... это заставляет все работать, как на устройствах 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);
}
Привет, большое спасибо за этот пост, я попытался использовать это решение в приложении, которое я пишу .... хотя оно, кажется, правильно перехватывает нажатия удаленных клавиш и перенаправляет их в представление игрока (поэтому элементы управления снова появляются ), побочный эффект, который я получаю, заключается в том, что активность больше их не получает.... следовательно, невозможно, например, нажать «назад» и больше выйти из проигрывателя... :-( как вы решили это?