我有一個非常基本的任務:使用Leanback框架和Exoplayer實現HLS視頻流。在Leanback應用程序中自定義播放控件
我用一個簡單的單片段佈局:
<?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
對應於一組鍵碼,但我不知道我能做些什麼。
任何人都可以指向正確的方向嗎?關於這個問題的信息令人驚訝。
謝謝。