web-dev-qa-db-fra.com

Android SeekBar pour contrôler la progression de MediaPlayer

J'ai un SeekBar, il affiche correctement MediaPlayer progress. Cependant, j'ai du mal à chercher - si je cherche une boîte de défilement quelque part, elle revient simplement à la position où le fichier audio est en cours de lecture. 

public class EntityPageActivity extends Activity implements Runnable, OnClickListener, OnSeekBarChangeListener{
    private SeekBar seekBar;
    private Button startMedia;
    private Button pauseMedia;
    private MediaPlayer mp;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.entity_page);             

        AudioControl();         

    }

    public void AudioControl(){
        seekBar = (SeekBar) findViewById(R.id.seekBar);
        startMedia = (Button) findViewById(R.id.play);
        pauseMedia = (Button) findViewById(R.id.pause);
        startMedia.setOnClickListener(this);
        pauseMedia.setOnClickListener(this); 
    }

    public void run() {
        int currentPosition= 0;
        int total = mp.getDuration();
        while (mp!=null && currentPosition<total) {
            try {
                Thread.sleep(1000);
                currentPosition= mp.getCurrentPosition();
            } catch (InterruptedException e) {
                return;
            } catch (Exception e) {
                return;
            }            
            seekBar.setProgress(currentPosition);
        }
    }

    public void onClick(View v) {
        if (v.equals(startMedia)) {
            if (mp != null && mp.isPlaying()) return;
            if(seekBar.getProgress() > 0) {
                mp.start();
                return;
            }
            mp = MediaPlayer.create(EntityPageActivity.this, R.raw.gl1);
            mp.start();                     
            seekBar.setProgress(0);
            seekBar.setMax(mp.getDuration());
            new Thread(this).start();
        }

        if (v.equals(pauseMedia) && mp!=null) {
            mp.pause();
        }       

    }

    public void onStartTrackingTouch(SeekBar seekBar) {
    }

    public void onStopTrackingTouch(SeekBar seekBar) {
    }

    public void onProgressChanged(SeekBar seekBar, int progress,
            boolean fromUser) {
        if(fromUser) mp.seekTo(progress);

    }
}

Ainsi, onProgressChanged n'est pas suffisant pour permettre à SeekBar de contrôler MediaPlayer?

Que dois-je ajouter/corriger pour permettre la recherche?

Merci

METTRE &AGRAVE; JOUR

J'ai découvert que onProgressChanged n'est jamais invoqué pour une raison quelconque. Cependant, je ne comprends pas pourquoi

21
Ilya Blokh

Le problème est seekBar.setOnSeekBarChangeListener(this); Donc, mettez-le dans votre méthode AudioControl() ..... Vous ne définissez pas oncheckchangedlistner sur votre barre de recherche ....

10
Samir Mangroliya

Essayez avec le code suivant:

public void onProgressChanged(SeekBar seekBar, int progress,
            boolean fromUser) {
        if(fromUser){
        mp.seekTo(progress);
        seekbar.setProgress(progress);}
 }
8
jyotiprakash

Vous devez inclure les méthodes seekbar dans la variable onCreate. J'ai eu le même problème, et cela a fonctionné après cela.

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
if(fromUser){ 
    mediaPlayer.seekTo(progress); 
    seekBar.setProgress(progress);
}
5
M1ndDr1ft

J'utilise ce code simple pour faire l'affaire. 

package in.bhartisoftwares.amit.allamitapps;

import Android.content.Context;
import Android.content.Intent;
import Android.media.AudioManager;
import Android.media.MediaPlayer;
import Android.support.v7.app.AppCompatActivity;
import Android.os.Bundle;
import Android.util.Log;
import Android.view.View;
import Android.widget.SeekBar;
import Android.widget.Toast;

import Java.util.Timer;
import Java.util.TimerTask;

public class audioControllerTwo extends AppCompatActivity {
    MediaPlayer mPlayer;        
    SeekBar audioTraverse;

ici, j'ai défini My SeekBar et MediaPlayer en classe publique. Ensuite, sur la méthode OnCreate, j'ai un code comme celui-ci:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_audio_controller_two);

    mPlayer = MediaPlayer.create(this, R.raw.song);

Ici, je crée une variable mPlayer, qui trouve mon fichier audio appelé "chanson" qui est présent dans le dossier "raw".

Ensuite, j'ai saisi ma SeekBar appelée "audioTraverse" et l'ai affectée à la variable "audioTraverse". J'ai saisi la "Durée" du fichier audio et l'attribution de cette durée à ma "AudioTraverse" SeekBar comme suit:

    audioTraverse = (SeekBar) findViewById(R.id.audioTraverse);
    audioTraverse.setMax(mPlayer.getDuration());

Maintenant, je lance une minuterie qui s'exécutera après chaque seconde et mettra à jour la position de SeekBar en conséquence. Voir le code ci-dessous:

new Timer().scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        audioTraverse.setProgress(mPlayer.getCurrentPosition());
    }
},0, 1000); // here 0 represents first time this timer will run... In this case it will run after 0 seconds after activity is launched
// And 1000 represents the time interval afer which  this thread i.e., "run()" will execute. In this case, it will execute after every 1 second

Maintenant, j'ajoute "SeekBarChangeListener", cela recherchera tous les changements sur SeekBar et dans la méthode "OnProgressChange ()", j'utilise la méthode ".seekTo ()" pour atteindre une durée particulière dans un fichier audio. Le code est le suivant:

        audioTraverse.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                Log.i("Tranverse Change: ", Integer.toString(i));
                mPlayer.seekTo(i);
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });
    }
}
0
Amit Mhaske

Essayez ce code dans la méthode onCreate () et exécutez le projet. J'espère que cela fonctionne.

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
            mediaPlayer.seekTo(i);
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });
0

si vous souhaitez reprendre le lecteur multimédia à une position spécifique à partir de la progression du changement de seekbar, je vous recommande de le faire dans la méthode onStopTrackingTouch (). cette méthode notifiera que l'utilisateur a terminé un geste tactile, puis définira la position du lecteur multimédia à partir de la position actuelle de seekbar. 

 @Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {
    mediaPlayer.seekTo(seekBar.getProgress());
}
0
arif ardiansyah