studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android media-player seekbar seek

programacion - SeekBar de Android para controlar el progreso de MediaPlayer



manual de programacion android pdf (6)

Tengo un SeekBar , muestra correctamente el progreso de MediaPlayer . Sin embargo, tengo problemas con la búsqueda: si busco el cuadro de desplazamiento en algún lugar, simplemente vuelve a la posición en la que se está reproduciendo el archivo de audio.

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 que SeekBar controle MediaPlayer ?

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

Gracias

ACTUALIZAR

Descubrí que onProgressChanged nunca se invoca por algún motivo. Sin embargo no puedo entender por qué


Debe incluir los métodos de la onCreate búsqueda dentro de 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); }


El problema es seekBar.setOnSeekBarChangeListener(this); Así que póngalo en el método de AudioControl() ... No establece oncheckchangedlistner en su barra de búsqueda ...


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 Mi SeekBar y MediaPlayer en clase pública. Luego, en el método OnCreate tengo un 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);

Aquí estoy creando la variable mPlayer, que encuentra mi archivo de audio llamado "song" que está presente en la carpeta "raw".

Luego agarré mi SeekBar llamada "audioTraverse" y la asigné a la variable "audioTraverse" y tomé la "Duración" del archivo de audio y asigné esa duración a mi SeekBar "audioTraverse" 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 SeekBar en consecuencia. Vea el código a continuación:

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 agregando "SeekBarChangeListener", esto buscará cualquier cambio en SeekBar y en el método "OnProgressChange ()" Estoy usando el método ".seekTo ()" para ir a una duración particular en el archivo de audio. El 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) { } }); } }


Intenta con el siguiente código:

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


Pruebe este código en el método onCreate () y ejecute el proyecto. Espero 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) { } });


Si desea reanudar el reproductor multimedia a una posición específica desde el progreso de cambio de la barra de búsqueda, le recomiendo que lo haga con el método onStopTrackingTouch (). ese método notificará que el usuario ha finalizado un gesto táctil y 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()); }