Android MediaPlayer getCurrentPosition () provoque le bégaiement audio

J'utilise un SeekBar pour afficher la progression d'un fichier audio et pour la recherche d'un certain temps. Pour la mise à jour, j'utilise un Runnable qui appelle getCurrentPosition () sur un MediaPlayer à chaque seconde. Chaque fois que cela se produit, il y a un petit décalage dans l'audio. Comme je l'appelle souvent, j'éprouve un bégaiement très visible tout en jouant à quelque chose. Si c'est pertinent, j'utilise setAudioStreamType (AudioManager.STREAM_MUSIC) et le format de fichier est mp4 avec audio AAC (pas de vidéo) et j'utilise Android 2.3.4. Existe-t-il un moyen d'obtenir un bon audio avec getCurrentPosition (), ou dois-je mettre en œuvre mes propres calculs de progression?

The Runnable:

  • Pourquoi la durée de validité n'est pas respectée par Android HttpURLConnection?
  • Onglets de matériel Android 5.0 avec barre d'outils
  • Les défis de RecyclerView d'Android L
  • Glisser l'animation xml sur l'activité de modification dans Android
  • Fragments affichés les uns sur les autres
  • Conservez l'état sélectionné du bouton Android
  • private Runnable mUpdateTask = new Runnable(){ @Override public void run() { mSeekBar.setProgress((int) (mPlayer.getCurrentPosition() * 100 / mArrayAdapter.getRecording(mPlayingId).mDuration)); mHandler.postDelayed(mUpdateTask, 999); } }; 

  • Android: Obtenez des raccourcis installés
  • Quel est l'api Android pour obtenir la liste des périphériques audio connectés?
  • Android 4.1.1 Build Stack for Activity lors de la réception d'une notification avec URI
  • L'envoi de tâches à un thread-pool donne RejectedExecutionException
  • Est-il indispensable de fermer la base de données?
  • Comment savoir "Ne pas garder les activités" est activé dans ICS?
  • 3 Solutions collect form web for “Android MediaPlayer getCurrentPosition () provoque le bégaiement audio”

    J'utilise cette méthode pour calciner le progrès "

     public static int getProgressPercentage(long currentDuration, long totalDuration) { Double percentage = (double) 0; long currentSeconds = (int) (currentDuration / 1000); long totalSeconds = (int) (totalDuration / 1000); // calculating percentage percentage = (((double) currentSeconds) / totalSeconds) * 100; // return percentage return percentage.intValue(); } 

    Remarque: mPlayer.getCurrentPosition () n'est pas précis. Certains bugs ont été signalés. J'ai eu problème que la position actuelle était supérieure à la durée totale.

    Vous pouvez faire quelque chose comme ceci:

     private Runnable mUpdateTask = new Runnable(){ @Override public void run() { mSeekBar.setProgress(mMediapPlayer.getCurrentPosition()); mHandler.postDelayed(mUpdateTask, 999); } }; 

    Vous pouvez également appliquer l'auditeur de changement de progression de barre de recherche comme suit:

     mSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) { if (fromUser) { int secProgress = seekBar.getSecondaryProgress(); if (secProgress> progress) { mMediapPlayer.seekTo(progress); } else { seekBar.setProgress(mSeekBar.getProgress()); } } } }); mMediapPlayer.setOnBufferingUpdateListener(new OnBufferingUpdateListener() { @Override public void onBufferingUpdate(MediaPlayer mp, int percent) { mSeekBar.setSecondaryProgress((mSeekBar.getMax()/100)*percent); } }); 

    J'ai eu le même problème ou quelque chose de semblable.

    Lorsque j'ai utilisé mMediapPlayer.getCurrentPosition() dans un TimerTask pour mettre à jour le SeekBar, j'ai entendu des problèmes de son comme echo mais en fait le problème n'était pas là.

    Le problème est que j'ai également utilisé SeekBar OnSeekBarChangeListener pour la recherche manuelle, mais ce qui s'est passé, c'est que la mise à jour du BusBar à partir du TimerTask a également déclenché l'auditeur, qui a fait mp.seekTo(progress) et cela a provoqué le retour à cette position encore..

    Je l'ai corrigé en utilisant l'argument fromUser comme suggéré ici pour ne chercher que si le seekBar a changé manuellement.

    Voici mon exemple de code:

    TimerTask:

     public void initializeTimerTask() { mTimerTask = new TimerTask() { public void run() { int progress = mp.getCurrentPosition()/1000; runOnUiThread(new Runnable() { @Override public void run() { mSeekBar.setProgress(progress); tvDuration.setText(DateUtils.formatElapsedTime(progress)); } }); } }; } 

    Auditeur:

      mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if(mp != null && fromUser){ mp.seekTo(progress * 1000); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.