隐藏控件时,Amazon Fire TV 遥控器不会暂停 ExoPlayer
Amazon Fire TV Remote Not Pausing ExoPlayer When Controls Hidden
我正在开发一个 Android 库,它只是一个简单的视频播放器,包装了 ExoPlayer。使用 Amazon Fire TV 时,我可以使用遥控器导航我的应用程序(方向键在我视图中的元素之间切换)并且我可以控制播放器(play/pause 按钮将切换播放状态,搜索按钮用作预期)...只要控制栏可见
3秒左右控制条自动隐藏,遥控器无反应
对此是否有适当的修复,或者我是否需要手动检测遥控器上的按键并显示控制栏?我觉得这是亚马逊的 ExoPlayer 端口应该解决的问题
更新
我扩展了 PlayerView
class 并覆盖了 dispatchKeyEvent
方法以查看所看到的内容:
public class Test extends PlayerView {
@Override
public boolean dispatchKeyEvent(KeyEvent event)
{
Log.debug("***** KEY EVENT: " + String.valueOf(event.getKeyCode()) + " *********");
return true;
}
}
这样做并按下遥控器上的播放按钮我注意到:
- 当控制栏可见时,
keyCode
值为 85
的 KeyEvent
被调度
- 隐藏控制栏时,此方法从未触发
我浏览了 PlayerView
可用的方法,看看是否有帮助,但似乎没有什么值得的:
setControllerAutoShow
- 确定视频首次启动时是否显示控制栏
setControllerHideDuringAds
- 确定控制栏在广告播放时是否可见
setControllerHideOnTouch
- 与 FireTV 无关(无触摸事件)但如果您点击视频会隐藏控制栏
setControllerHideTimeoutMs
- 可以延迟隐藏控制条,否则隐藏后不让我带回来
showController
- 可以在代码中强行显示控制器,允许我暂停视频,但我看不到按键事件,当按下遥控器上的按钮时我无法正确调用它控制
最终我只是希望它像 Netflix 或 Hulu 应用程序一样运行 - 控制栏会在几秒钟不活动后消失,但如果您按下暂停按钮,控制栏会恢复。
我找到了一个答案,但它不是一个完美的答案。出于某种原因(我仍然想知道为什么,如果有人能解释为什么那么我很乐意接受他们的回答而不是我的)当控制栏消失时 PlayerView
失去焦点,键盘事件不再发送给它.但是,托管 PlayerView
的 Activity 仍然可以看到所有键盘事件。所以我将以下内容添加到我的 Activity:
@Override
public boolean dispatchKeyEvent(KeyEvent event)
{
playerView.dispatchKeyEvent(event);
return true;
}
现在无论控制条是否可见,播放器仍然响应所有按键事件。然而:
- 这需要编辑 activity,这意味着任何使用我的播放器库的人都需要了解这个额外的步骤才能正确集成播放器
- 这并不能解释玩家失去焦点的原因,它只是规避了这个问题
我对你的解决方案做了一些扩展,让所有的控件都能工作——包括玩家的和 activity 的——因为不可能再退出 activity,而且,不同的设备,如电话,无法操作音量控制......这使得一切正常,无论是在 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);
}
我正在开发一个 Android 库,它只是一个简单的视频播放器,包装了 ExoPlayer。使用 Amazon Fire TV 时,我可以使用遥控器导航我的应用程序(方向键在我视图中的元素之间切换)并且我可以控制播放器(play/pause 按钮将切换播放状态,搜索按钮用作预期)...只要控制栏可见
3秒左右控制条自动隐藏,遥控器无反应
对此是否有适当的修复,或者我是否需要手动检测遥控器上的按键并显示控制栏?我觉得这是亚马逊的 ExoPlayer 端口应该解决的问题
更新
我扩展了 PlayerView
class 并覆盖了 dispatchKeyEvent
方法以查看所看到的内容:
public class Test extends PlayerView {
@Override
public boolean dispatchKeyEvent(KeyEvent event)
{
Log.debug("***** KEY EVENT: " + String.valueOf(event.getKeyCode()) + " *********");
return true;
}
}
这样做并按下遥控器上的播放按钮我注意到:
- 当控制栏可见时,
keyCode
值为85
的KeyEvent
被调度 - 隐藏控制栏时,此方法从未触发
我浏览了 PlayerView
可用的方法,看看是否有帮助,但似乎没有什么值得的:
setControllerAutoShow
- 确定视频首次启动时是否显示控制栏setControllerHideDuringAds
- 确定控制栏在广告播放时是否可见setControllerHideOnTouch
- 与 FireTV 无关(无触摸事件)但如果您点击视频会隐藏控制栏setControllerHideTimeoutMs
- 可以延迟隐藏控制条,否则隐藏后不让我带回来showController
- 可以在代码中强行显示控制器,允许我暂停视频,但我看不到按键事件,当按下遥控器上的按钮时我无法正确调用它控制
最终我只是希望它像 Netflix 或 Hulu 应用程序一样运行 - 控制栏会在几秒钟不活动后消失,但如果您按下暂停按钮,控制栏会恢复。
我找到了一个答案,但它不是一个完美的答案。出于某种原因(我仍然想知道为什么,如果有人能解释为什么那么我很乐意接受他们的回答而不是我的)当控制栏消失时 PlayerView
失去焦点,键盘事件不再发送给它.但是,托管 PlayerView
的 Activity 仍然可以看到所有键盘事件。所以我将以下内容添加到我的 Activity:
@Override
public boolean dispatchKeyEvent(KeyEvent event)
{
playerView.dispatchKeyEvent(event);
return true;
}
现在无论控制条是否可见,播放器仍然响应所有按键事件。然而:
- 这需要编辑 activity,这意味着任何使用我的播放器库的人都需要了解这个额外的步骤才能正确集成播放器
- 这并不能解释玩家失去焦点的原因,它只是规避了这个问题
我对你的解决方案做了一些扩展,让所有的控件都能工作——包括玩家的和 activity 的——因为不可能再退出 activity,而且,不同的设备,如电话,无法操作音量控制......这使得一切正常,无论是在 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);
}