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:
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.