Stack Overflow en español es un sitio de preguntas y respuestas para programadores y profesionales de la informática. Solo te toma un minuto registrarte.
Regístrate para unirte a esta comunidad
Estoy trabajando en una galería de fotografías que incluyen un audio de como se pronuncian las cosas que el usuario está viendo en pantalla, lo cual se ejecuta con un botón incluido también en pantalla.
Por cada fotografía tengo la uri de su respectivo audio, y al presionar el botón de reproducir se ejecuta el siguiente código:
View.OnClickListener eventoPlay = (v) → {
@Override
public void onClick(View v) {
btnPlaySound.setClickable(false);
Uri myUri = Uri.parse(urlroot + urlAudio); //variables que seteo de manera global al cargar la imagen
final MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.release();
btnPlaySound.setClickable(true);
mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
btnPlaySound.setClickable(true);
Log.e("Error in media player", String.valueOf(what));
Log.e("Error in media player", String.valueOf(extra));
return false;
mediaPlayer.prepareAsync();
}catch (Exception e){
e.printStackTrace();
btnPlaySound.setClickable(true);
btnPlaySound.setOnClickListener(eventoPlay);
btnPlaySound.performClick();
El código funciona, pero algunas veces el audio se corta antes de terminar de reproducirse, el problema con esto es que no estoy recibiendo ningún log
de error, he depurado y he notado que mediaPlayer.setOnErrorListener()
nunca se ejecuta (aunque el audio halla sido cortado) y tampoco se ejecuta el bloque de catch
por lo que no he identificado que está sucediendo.
Estos son los escenarios que he depurado:
-setOnPreparedListener()
Se ejecuta de manera natural, siempre (el audio comienza a reproducirse siempre).
-setOnCompletionListener()
Se ejecuta solamente si el audio se terminó de reproducir (si no se ha cortado el audio).
-setOnErrorListener()
No se ejecuta nunca, sin importar que el audio se halla cortado.
-catch
Este bloque tampoco se ejecuta nunca, igualmente sin importar si el audio se corta.
¿alguien sabe a qué se debe esto? ¿hay algo que estoy omitiendo?¿o hay alguna otra forma de depurar que pueda ayudarme a encontrar el origen de la anomalía?
–
–
–
Comentas que el audio se encuentra en tu proyecto y no se carga mediante un url, te sugiero en este caso cambiar:
mediaPlayer.prepareAsync();
mediaPlayer.prepare();
me parece que es lo que esta provocando el "bloqueo", no es necesario usar prepareAsync()
ya que no estas descargando el archivo multimedia.
prepare()
es usado para reproducir la multimedia Sincronamente.
prepareAsync()
es usado para reproducir la multimedia Asincronamente.
¡Gracias por contribuir en StackOverflow en español con una respuesta!
- Por favor, asegúrate de responder a la pregunta. ¡Proporciona información y comparte tu investigación!
Pero evita…
- Pedir ayuda o aclaraciones, o responder a otras respuestas.
- Hacer declaraciones basadas en opiniones; asegúrate de respaldarlas con referencias o con tu propia experiencia personal.
Para obtener más información, consulta nuestros consejos sobre cómo escribir grandes respuestas.