¿Cómo implementar un reinicio de MediaPlayer en errores en Android?

Estoy tratando de implementar el reinicio de MediaPlayer en Android, cuando ocurren errores (conexión con el servidor perdido, la red es inaccesible y otros). He visto muchos ejemplos de código, pero todos son algo no estándar. Creo que debe haber la forma estándar de reiniciar el correspondiente a developer.android.com, pero no está claro de aquí, cómo establecer el oyente que reiniciar el jugador en tales errores.

Aquí están las partes de mi código:

public class PlayerService extends Service implements OnErrorListener { .... //////////////////// this.mplayer = MediaPlayer.create(c, Uri.parse(url)); mplayer.setOnErrorListener(onErrorListener); //////////////////// MediaPlayer.OnErrorListener onErrorListener = new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { Log.e(getPackageName(), String.format("Error(%s%s)", what, extra)); playlist="ERROR"; restart(); return true; } }; @Override public boolean onError(MediaPlayer player, int what, int extra) { restart(); return true; }; public void restart() { try { playlist="RELOADING"; for (int u=1; u<=5; u++) { Thread.sleep(5000); mplayer.stop(); mplayer.release(); mplayer=null; playSong(getApplicationContext(),currenturl); }; } catch (Exception e) { playlist="RELOADING ERROR"; } } ////////////// .... } 

¿Estoy poniendo el oyente correcto? No estoy seguro donde poner la función onError así que tengo 2 de ellos. Cuando emule el error al configurar el teléfono en el modo de vuelo, el oyente activa el título "RELOADING" y "RELOADING ERROR". Pero después de que la red esté encendida, no se reiniciará el reproductor. No hay sonido.

¿Qué hay de malo aquí? El reproductor no puede reiniciarse.

Ayude a que el código funcione. También pueden ser saltos de conexión e IO Exception.

Visión de conjunto

Me encontré con un problema similar y, basándome en la documentación, indica que todo lo que necesitas hacer es restablecer tu reproductor multimedia:

Para reutilizar un objeto MediaPlayer que se encuentra en el estado Error y recuperarse del error, se puede llamar a reset () para restaurar el objeto a su estado inactivo.

Lo que está haciendo actualmente es detener y liberar ( mplayer.stop() y mplayer.release() ) un reproductor multimedia que se encuentra en el estado Error. Esto debería estar causando algo como un IllegalStateException que se plantea. Si no está lanzando un error que todavía estaría tratando de iniciar una canción en un objeto nulo. En lugar de llamar a detener y liberar, a continuación, establecer la variable a null debe utilizar la función mplayer.reset() .

Otra opción sería iniciar un nuevo reproductor de medios, pero la documentación detalla la sutil diferencia entre un objeto MediaPlayer recién instanciado y uno que ha sido reset() en él.

Restablecer después del error

Sobre la base de esta información algo como lo siguiente debe solucionar su problema:

  public boolean onError(MediaPlayer mp, int what, int extra) { Log.e(getPackageName(), String.format("Error(%s%s)", what, extra)); playlist="ERROR"; if(what == MediaPlayer.MEDIA_ERROR_SERVER_DIED) mp.reset(); else if(what == MediaPlayer.MEDIA_ERROR_UNKNOWN) mp.reset(); // Deal with any other errors you need to. // I'm under the assumption you set the path to the song // and handle onPrepare, start(), etc with this function playSong(getApplicationContext(),currenturl); mplayer.setOnErrorListener(this); mplayer.setOnCompletionListener(this); mplayer.setOnPreparedListener(this); return true; } 

Consulte la documentación constante del reproductor multimedia para obtener una lista de posibles errores.

Configuración del detector de errores

En cuanto a la configuración del detector de errores, he aquí cómo lo he implementado en el pasado:

 public class MediaPlayerActivity extends Activity implements OnCompletionListener, OnPreparedListener, AnimationListener, OnErrorListener{ private MediaPlayer mediaPlayer; @Override public boolean onError(final MediaPlayer arg0, final int arg1, final int arg2) { // Error handling logic here return true; } protected void onResume(){ super.onResume(); // do some onResume logic mediaPlayer.setOnErrorListener(this); mediaPlayer.setOnCompletionListener(this); mediaPlayer.setOnPreparedListener(this); // finish on resume and start up media player } } 

A continuación, manejo cargar el reproductor de medios en otra función iniciada por onResume ().

  • Video androide, escuchar sonido pero no video
  • Android - ¿Cómo puedo permitir que una instancia de MediaPlayer se reproduzca a la vez?
  • SurfaceView en blanco al reproducir vídeo usinng mediaplayer
  • SetVideoSurfaceTexture ha fallado: -22 en mediaplayer
  • Buscando retroalimentación técnica en Nextreaming NexPlayer ™
  • Establecer mi aplicación como reproductor de música por defecto en android programatically
  • Android MediaPlayer se está preparando demasiado tiempo
  • ¿Grabar audio en Android con MediaPlayer como fuente?
  • Android Mediaplayer: problema de setDataSource para el archivo de medios descargado
  • Cómo configurar presets eq en android?
  • Android Visualizador FFT / onda afectada por el volumen del dispositivo?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.