我有一个非常基本的任务:使用Leanback框架和Exoplayer实现HLS视频流。
我使用简单的单片段布局:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/video_fragment"
android:name="android.support.v17.leanback.app.VideoFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
显然,VideoFragment
附带一个默认的HUD,如下所示:
根据文档,推荐使用播放控件桥接媒体播放器的方法是PlaybackGlue
。例如,Leanback展示应用使用MediaPlayer
,因此使用MediaPlayerGlue
。就我的目的而言,我从this项目中获取了ExoPlayerGlue
。
private PlaybackFragmentGlueHost glueHost;
private PlaybackControlGlue glue;
@Override
public void onCreate(Bundle savedInstanceState) {
// ...
final VideoFragment videoFragment = (VideoFragment) getFragmentManager.findFragmentById(R.id.video_fragment);
glueHost = new VideoFragmentGlueHost(videoFragment);
glue = ExoPlayerGlue(this, player)
glue.setHost(glueHost);
}
此代码完成工作:它将点击绑定到播放器事件,因此按预期暂停/恢复和倒带/快进工作。
棘手的部分是自定义播放控件。 PlaybackGlueHost
提供setPlaybackRow(Row row)
和setPlaybackRowPresenter(PlaybackRowPresenter presenter)
方法。值得指出的是,这些方法在onCreate()
中没有任何效果,所以我要么使用处理程序,要么将它们移到onPostCreate()
:
@Override
public void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Buttons I need in my HUD
final Action skipPreviousAction = new PlaybackControlsRow.SkipPreviousAction(this); // |<
final Action rewindAction = PlaybackControlsRow.RewindAction(this); // <<
final Action playPauseAction = PlaybackControlsRow.PlayPauseAction(this);
final Action fastForwardAction = PlaybackControlsRow.FastForwardAction(this); // >>
final Action skipNextAction = PlaybackControlsRow.SkipNextAction(this); // >|
final Action repeatAction = PlaybackControlsRow.RepeatAction(this);
final PresenterSelector controlPresenterSelector = ControlButtonPresenterSelector();
final PlaybackControlsRow playbackControlsRow = PlaybackControlsRow();
final ArrayObjectAdapter primaryAdapter = ArrayObjectAdapter(controlPresenterSelector);
final ArrayObjectAdapter secondaryAdapter = ArrayObjectAdapter(controlPresenterSelector);
// First row
primaryAdapter.add(skipPreviousAction);
primaryAdapter.add(rewindAction);
primaryAdapter.add(playPauseAction);
primaryAdapter.add(fastForwardAction);
primaryAdapter.add(skipNextAction);
// Second row
secondaryAdapter.add(repeatAction);
playbackControlsRow.primaryActionsAdapter = primaryAdapter;
playbackControlsRow.secondaryActionsAdapter = secondaryAdapter;
// Applying row to glue host
glueHost.setPlaybackRowPresenter(PlaybackControlsRowPresenter());
glueHost.setPlaybackRow(playbackControlsRow);
}
现在我有自定义的播放行,但播放器不再响应按钮点击次数。
我很难弄清楚PlaybackGlue
对PlaybackGlueHost
事件的实际反应。我知道我可以在行演示器中设置OnActionClickedListener
并手动处理动作,但它会使胶水/主机交互模型无效。它是如何起作用的?没有我能找到的默认播放行...我看到每个Action
对应一组键码,但我不知道我能做些什么。
有人能指出我正确的方向吗?关于这个问题的信息很少令人惊讶。
感谢。
答案 0 :(得分:2)
原来PlaybackControlGlue
有所有必要的方法(setControlsRow()
,onCreatePrimaryActions()
,onCreateSecondaryActions()
),我在借用的实施中完全错过了这些方法。胶水负责在onAttachedToHost()
中将它们提供给主机,然后设置必要的监听器。