Exoplayer在播放/暂停时不显示控制器



我想在我的Exoplayer中实现mediaKeyEvents用于电视。

现在我有一个工作设置:

override fun onCreate(savedInstanceState: Bundle?) {
...
//Don't show controller on start
viewBinding.playerView.controllerAutoShow = false
...
}
override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
when (keyCode) {
KeyEvent.KEYCODE_MEDIA_PLAY -> {
if (viewBinding.playerView.player!!.isPlaying) {
viewBinding.playerView.player!!.pause()
} else {
viewBinding.playerView.player!!.play()
}
return true
}
KeyEvent.KEYCODE_DPAD_RIGHT -> {
viewBinding.playerView.player!!.seekForward()
return true
}
KeyEvent.KEYCODE_DPAD_LEFT -> {
viewBinding.playerView.player!!.seekBack()
return true
}
}
return super.onKeyDown(keyCode, event)
}

对我来说最重要的电视控制是Nvidia Shield Pro控制器的控制。

问题:在这种设置中,每当我播放/暂停时控制器都会显示。我曾试图禁用控制器,然后查找回/向前工作,然而,播放/暂停停止工作(此外,我想保持控制器,只是隐藏)。

所需行为:

像plex或youtube,这些动作发生的地方:

不显示控制器的动作:

  • 播放/暂停
  • 寻求后退/前进

显示控制器的动作:

  • 按下键显示未激活的控制器
  • 按下键隐藏控制器

My ExoPlayer layout:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:keepScreenOn="true">
<com.google.android.exoplayer2.ui.StyledPlayerView
android:id="@+id/player_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:keepScreenOn="true"
app:show_shuffle_button="false"
app:show_subtitle_button="true" />
<LinearLayout
android:id="@+id/controls_root"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:visibility="gone">
<Button
android:id="@+id/select_tracks_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:enabled="false"
android:text="TEST" />
</LinearLayout>
</FrameLayout>

我找到了解决方案,我不应该使用onKeyDown,而是:

@SuppressLint("RestrictedApi")
override fun dispatchKeyEvent(event: KeyEvent?): Boolean {
if (event?.action == KeyEvent.ACTION_DOWN) {
when (event?.keyCode) {
KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE -> {
if (viewBinding.playerView.player!!.isPlaying) {
viewBinding.playerView.player!!.pause()
} else {
viewBinding.playerView.player!!.play()
}
return true
}
KeyEvent.KEYCODE_DPAD_RIGHT -> {
viewBinding.playerView.player!!.seekForward()
return true
}
KeyEvent.KEYCODE_DPAD_LEFT -> {
viewBinding.playerView.player!!.seekBack()
return true
}
}
}

return false
}

如果你复制粘贴,请注意:这将删除所有其他键绑定,因为我想编程后退按钮以及关闭控制器,如果打开,否则返回。

最新更新