2017-05-17 39 views
0

我有一個非常基本的任務:使用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它看起來像這樣:

enter image description here

根據該文檔,建議的方法通過播放控件橋接媒體播放器是通過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

原來PlaybackControlGlue有所有必要的方法(setControlsRow(),onCreatePrimaryActions(),onCreateSecondaryActions()),我完全錯過了我借用的實現。膠水將照片提供給主機onAttachedToHost(),然後設置必要的聽衆。

相關問題