Android SeekBar para controlar el progreso de MediaPlayer
Tengo un SeekBar
, exhibe correctamente el progreso de MediaPlayer
. Sin embargo, tengo problemas con la búsqueda – si busco el cuadro de desplazamiento en algún lugar que sólo vuelve a la posición donde el archivo de audio está jugando.
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
para controlar MediaPlayer
?
- Android: ¿Cómo usar mediaController en la clase de servicio?
- Cambiar URI de MediaPlayer
- ¿Por qué MediaPlayer muestra tanto el registro de Verbose en android?
- Android lo que hace exactamente error mediaplayer 1, -107
- Cómo transmitir contenido autenticado con MediaPlayer en Android
¿Qué debo agregar / corregir para permitir la búsqueda?
Gracias
ACTUALIZAR
Descubrí que onProgressChanged
nunca es invocado por alguna razón. Sin embargo no puedo entender por qué
- Jugar dos sonidos Simutaneosly
- El reproductor de video apaga el modo en Android usando appcompat-v7
- Android MediaPlayer hace que el juego se congele con "AudioHardware pcm la reproducción se va a esperar"
- ¿Cómo hacer una aplicación móvil DLNA android?
- ¿Cómo puedo enviar un archivo pregrabado (wav) durante una llamada de voz?
- Android - MediaPlayer's en Preparado Llamado incluso antes de que el flujo se prepare en Android 4.0+
- Android Mediaplayer: problema de setDataSource para el archivo de medios descargado
- Crear mediaplayer con inputstream en android
El problema es seekBar.setOnSeekBarChangeListener(this);
Así que ponerlo en su método AudioControl()
….. Usted no establece oncheckchangedlistner
a su seekbar ….
Prueba con el código siguiente:
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if(fromUser){ mp.seekTo(progress); seekbar.setProgress(progress);} }
Tienes que incluir los métodos seekbar dentro de la 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); }
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) { } });
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 en OnCreate Method 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);
Aquí estoy creando mPlayer variable, que encuentra mi archivo de audio llamado "song" que está presente en la carpeta "raw".
Entonces agarré mi SeekBar llamado "audioTraverse" y lo asigné a "audioTraverse" variable y agarrar la "Duración" del archivo de audio y asignar esa duración a mi "audioTraverse" SeekBar como sigue:
audioTraverse = (SeekBar) findViewById(R.id.audioTraverse); audioTraverse.setMax(mPlayer.getDuration());
Ahora estoy ejecutando un temporizador que se ejecutará después de cada segundo y se actualizará la posición SeekBar en consecuencia. Vea el siguiente código:
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 ie, "run()" will execute. In this case, it will execute after every 1 second
Ahora estoy añadiendo "SeekBarChangeListener", esto buscará cualquier cambio en SeekBar y en "OnProgressChange ()" método que estoy usando ".seekTo ()" método 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) { } }); } }
- ¿Es posible usar las pestañas AND de desplegable como navegación en la barra de acción?
- Dagger 2 Alcance personalizado para cada fragmento (o actividad, etc …)