2012-02-28 14 views
20

Tengo un SeekBar, muestra correctamente el progreso MediaPlayer. Sin embargo, tengo problemas con la búsqueda: si busco el cuadro de desplazamiento en algún lugar, simplemente regresa en la posición donde se reproduce el archivo de audio.Android SeekBar para controlar el progreso de MediaPlayer

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); 

    } 
} 

Por lo tanto, onProgressChanged no es suficiente para permitir SeekBar para controlar MediaPlayer?

¿Qué debo agregar/corregir para permitir la búsqueda?

Gracias

ACTUALIZACIÓN

descubrí que onProgressChanged no es invocado por alguna razón. Sin embargo no puedo entender por qué

+0

@llya Tengo reproductor de medios pero funciona con video y funciona bien, ¿puedo ayudarte? –

+0

Creo que sabes mejor puedes ayudar o no) Si crees que sabes cómo resolver el problema, intenta dar una respuesta –

+0

ver mi respuesta .............. –

Respuesta

10

El problema es seekBar.setOnSeekBarChangeListener(this); Así que lo puso en su AudioControl() Método ..... usted no configura oncheckchangedlistner a tu barra de búsqueda. ...

+0

¡Exactamente! Parece que simplemente lo olvidé. Gracias –

6

intento con el siguiente código:

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

'MediaPlayer' no tiene el método' setProgress' –

+0

seekbar.setProgress (progress); – jyotiprakash

+0

Desafortunadamente no ayudó –

5

Debe incluir los métodos de barra de búsqueda dentro del onCreate. Tuve el mismo problema, y ​​funcionó después de eso.

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

probar este código en el método onCreate() y ejecute el project.I esperanza de que esto esté funcionando.

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

Estoy usando este código simple para hacer el truco.

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; 

aquí He definido My SeekBar y MediaPlayer en clase pública. Luego, el OnCreate Método tengo código como este:

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

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

Voy a crear la variable mPlayer, que encuentra mi archivo de audio llamado "canción" que está presente en la carpeta "en bruto".

Entonces me agarró SeekBar llamado "audioTraverse" y le asignó a "audioTraverse" variable y el acaparamiento de la "duración" del archivo de audio y la asignación de que la duración de mi "audioTraverse" SeekBar de la siguiente manera:

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

Ahora estoy ejecutando un temporizador que se ejecutará después de cada segundo y actualizará la posición de SeekBar en consecuencia. Ver el código de abajo:

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 

Ahora estoy añadiendo "SeekBarChangeListener", esto va a buscar cualquier cambio en SeekBar y en "OnProgressChange()" método que estoy usando el método ".seekTo()" para ir a una duración particular en archivo de audio. Código es el siguiente:

 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

si desea reanudar reproductor multimedia a la posición específica del progreso seekbar cambio, recomiendo que hagas ese método en onStopTrackingTouch().ese método notificará que el usuario ha terminado un gesto táctil, luego establecerá la posición del reproductor de medios desde la posición actual de la barra de búsqueda.

@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()); 
} 
Cuestiones relacionadas