web-dev-qa-db-fra.com

Détecter la pause / reprise dans ExoPlayer

J'ai cherché cette question pendant deux jours dans github mais je ne trouve pas la vraie réponse. Je veux un exemple pour détecter pause / resume dans ExoPlayer > 2.x. Quelqu'un peut-il me donner un exemple? J'ai vérifié onPlayerStateChanged et le problème n'est pas résolu.

onPlayerStateChanged   :   STATE_BUFFERING 
onPlayerStateChanged   :   STATE_READY 

Je viens de recevoir ce journal de onPlayerStateChanged et ce n'est pas appelé en tout temps!

16
b4hr4m

Vous devez vérifier playWhenReady avec un Player.EventListener . Les états de lecture d'ExoPlayer sont indépendants du fait que le lecteur soit en pause ou non:

player.addListener(new Player.DefaultEventListener() {
  @Override
  public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
    if (playWhenReady && playbackState == Player.STATE_READY) {
      // media actually playing
    } else if (playWhenReady) {
      // might be idle (plays after prepare()), 
      // buffering (plays when data available) 
      // or ended (plays when seek away from end)
    } else {
      // player paused in any state
    }
  }
});

Pour lire/mettre en pause le lecteur fourni par ExoPlayer

player.setPlayWhenReady(boolean)

La séquence des états de lecture avec ExoPlayer avec un fichier multimédia qui ne s'arrête jamais pour rebuffer est une fois dans chacun des quatre états et n'exprime pas la lecture/pause:

Player.STATE_IDLE;
Player.STATE_BUFFERING;
Player.STATE_READY;
Player.STATE_ENDED;

Chaque fois que le joueur a besoin de tamponner, il va:

Player.STATE_READY;
Player.STATE_BUFFERING;
Player.STATE_READY;

Le réglage de playWhenReady n'affecte pas l'état.

Tous ensemble, vos médias sont en train de jouer lorsque

playWhenReady && playbackState == Player.STATE_READY

Il joue lorsqu'il est prêt. :)

44
marcbaechinger

Vous pouvez utiliser cette fonction:

public boolean isPlaying() {
    return exoPlayer.getPlaybackState() == Player.STATE_READY && exoPlayer.getPlayWhenReady();
}
6
Photon

Vous pouvez utiliser exoplayer.getPlayWhenReady() pour vérifier si le lecteur est actuellement en pause ou en lecture.

2
Rohan Seth

J'avais la même exigence pour détecter l'événement de clic du bouton de lecture/pause d'exoplayer. Les réponses ci-dessus parlaient principalement de l'état et non de l'événement de clic de bouton.

C'est ce que j'ai fait pour détecter le clic du bouton Lecture/Pause, fonctionne parfaitement.

Étape 1: créer une classe de répartiteur de contrôle personnalisée et remplacer la méthode dispatchSetPlayWhenReady

class PlayerControlDispatcher : DefaultControlDispatcher() {
    override fun dispatchSetPlayWhenReady(player: Player?, playWhenReady: Boolean): Boolean {
        if(playWhenReady) {
           // Play button clicked
        } else {
          // Paused button clicked
        }
        return super.dispatchSetPlayWhenReady(player, playWhenReady)
    }
}

Étape 2: définissez la classe de répartiteur de contrôle personnalisé PlayerControlDispatcher dans la vue du lecteur.

playerView.setControlDispatcher(PlayerComponentCallback())

Où playerView est une instance de com.google.Android.exoplayer2.ui.PlayerView que nous déclarons dans notre fichier de mise en page.

0
Krishna Sharma