相关文章推荐
迷茫的枕头  ·  creator ...·  1 月前    · 
腹黑的板凳  ·  Gartner reafirma a ...·  2 月前    · 
听话的棒棒糖  ·  Edge Impulse | ...·  1 年前    · 

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?

A que te refieres que no reproduce de manera correcta, ¿se detiene, se pausa, no se escucha? De acuerdo a tu código el url se obtiene de un url, podría ser la red el problema. – Jorgesys el 14 may. 2019 a las 0:11 algunas veces el audio se corta antes de terminar de reproducirse , Se detiene, sin mas. Mis audios no rebasan los 3 segundos de duración, y ningún archivo de audio supera los 400kb de tamaño en disco. Y no, no es URL de red, es URi hacia el almacenamiento interno del teléfono. – Jesús Miraanda el 14 may. 2019 a las 14:24 Así es, se reproduce correctamente, testeado en app de files de google, google play music y el reporductor integrado en miui de xiaomi. – Jesús Miraanda el 14 may. 2019 a las 15:48

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.