web-dev-qa-db-fra.com

Android - Comment savoir quand MediaPlayer met en mémoire tampon

Il me manque quelque chose d'évident ici, mais je n'arrive pas à trouver quoi que ce soit qui me permette de déterminer quand MediaPlayer met en mémoire tampon l'audio. Je diffuse de l'audio sur Internet et je souhaite afficher un indicateur de mise en mémoire tampon, mais rien de ce que j'ai essayé ne me permet de savoir quand MediaPlayer interrompt l'audio dans la mémoire tampon. Des indices?

33
Daniel

@Daniel, d'après votre commentaire sur la réponse de @ JRL, vous pourriez probablement résoudre ce problème en créant un fil de discussion et en attendant un délai d'attente.

Quelque chose comme DetectBufferTimeout.Java (non testé) ferait bien l'affaire.

Je suis cependant d'accord pour dire que faire tourner ce fil séparé est un peu un bidouillage. OnBufferingUpdateListener pourrait peut-être donner une garantie quant à la fréquence à laquelle il appelle onBufferingUpdate(), qu'un changement dans la progression de la mise en mémoire tampon ait eu lieu afin que nous puissions détecter si nous obtenons la même valeur à plusieurs reprises.

7
Matt Briançon

Comme ci-dessous (niveau API ≥ 9):

mp.setOnInfoListener(new OnInfoListener() {

    @Override
    public boolean onInfo(MediaPlayer mp, int what, int extra) {
        switch (what) {
            case MediaPlayer.MEDIA_INFO_BUFFERING_START:
                loadingDialog.setVisibility(View.VISIBLE);
                break;
            case MediaPlayer.MEDIA_INFO_BUFFERING_END:
                loadingDialog.setVisibility(View.GONE);
                break;
        }
        return false;
    }
});

NOTE: Il y a un bogue connu dans Android. Lors de la lecture d'un flux HLS, il n'appelle jamais jamais OnInfoListener ou OnBuffering. vérifier ce lien Bug OnInfoListener

54
ljian

Ok, je me sens un peu justifié maintenant. J'ai vérifié l'application Pandora et elle n'affiche pas d'indicateur de mise en mémoire tampon. Lorsque la musique est interrompue pour la mise en mémoire tampon, elle reste comme si rien ne s'était passé et l'interface utilisateur semble toujours en cours de lecture. Je suis donc parvenu à la conclusion que si vous utilisez MediaPlayer, il est tout simplement impossible de déterminer si la piste est suspendue temporairement pour la mise en mémoire tampon.

Cependant, j’ai remarqué que deux ou trois constantes MediaPlayer pourraient être utiles: MEDIA_INFO_BUFFERING_START et MEDIA_INFO_BUFFERING_END. Mais ils ne sont disponibles qu’au niveau API 9+, et la documentation ne dit rien à leur sujet. Je suppose qu'ils peuvent être utilisés avec un OnInfoListener.

Je suis déçu, mais au moins je peux arrêter de tourner mes roues maintenant et passer à autre chose.

10
Daniel

Enregistrez un OnBufferingUpdate listener.

1
JRL

Vous pouvez utiliser un fil qui vérifie la position actuelle du MediaPlayer. Si la position ne change pas, vous pouvez en conclure que le support est en état de mise en mémoire tampon. Voici le tutoriel complet que j'ai écrit: http://www.ottodroid.net/?p=260

0
Murat