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!
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. :)
Vous pouvez utiliser cette fonction:
public boolean isPlaying() {
return exoPlayer.getPlaybackState() == Player.STATE_READY && exoPlayer.getPlayWhenReady();
}
Vous pouvez utiliser exoplayer.getPlayWhenReady()
pour vérifier si le lecteur est actuellement en pause ou en lecture.
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.