2017-05-17 1 views
0

J'ai une tâche assez simple: mettre en œuvre le streaming vidéo HLS en utilisant le framework Leanback et Exoplayer.Personnalisation des commandes de lecture dans une application Leanback

-je utiliser une mise en page simple simple fragment:

<?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> 

Apparemment, VideoFragment est livré avec un défaut HUD qui ressemble à ceci:

enter image description here

Selon la documentation, l'approche recommandée pour relier le lecteur multimédia avec les commandes de lecture est via PlaybackGlue. Par exemple, l'application Leanback Showcase utilise MediaPlayer et utilise donc un MediaPlayerGlue. J'ai, pour mes buts, pris ExoPlayerGlue du projet this.

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); 
} 

Ce code fait le travail: il se lie à des événements de clics joueur, donc une pause/reprise et le rebobinage/travail avance rapide comme prévu.

La partie délicate est la personnalisation des commandes de lecture. PlaybackGlueHost fournit les méthodes setPlaybackRow(Row row) et setPlaybackRowPresenter(PlaybackRowPresenter presenter). A signaler est que ces méthodes ont aucun effet dans onCreate() donc je soit avoir à utiliser gestionnaire ou les déplacer vers 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); 
} 

Maintenant, j'ai ma ligne de lecture personnalisée, mais le joueur ne répond plus à bouton clique .

J'ai du mal à comprendre comment PlaybackGlue réagit réellement aux événements d'un PlaybackGlueHost. Je sais que je peux définir OnActionClickedListener dans un présentateur de ligne et gérer les actions manuellement mais cela rend le modèle d'interaction colle/hôte inutile. Comment cela a-t-il fonctionné en premier lieu? Il n'y a pas de ligne de lecture par défaut que je pourrais trouver ... Je vois que chaque Action correspond à un ensemble de codes clés mais je ne suis pas sûr de ce que je peux en faire.

Quelqu'un pourrait-il me diriger dans la bonne direction? Il y a étonnamment peu d'informations sur le sujet.

Merci.

Répondre

0

Retourné PlaybackControlGlue avaient toutes les méthodes nécessaires (setControlsRow(), onCreatePrimaryActions(), onCreateSecondaryActions()) que je totalement ratées dans la mise en œuvre que j'ai emprunté. La colle prend soin de les fournir à son hôte dans onAttachedToHost(), puis définit les auditeurs nécessaires.