¿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.

One Solution collect form web for “¿Cómo implementar un reinicio de MediaPlayer en errores en Android?”

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 ().

  • Android MediaPlayer se está preparando demasiado tiempo
  • Control de reproducción de botón de pausa en fragmento de servicio de reproductor de música
  • SurfaceView en blanco al reproducir vídeo usinng mediaplayer
  • ¿Cómo desarrollar un reproductor de video que recibe transmisión de video en la difusión wi-fi / multidifusión?
  • Reproductor de vídeo en android (desarrollar)
  • Cómo reproducir el archivo de audio Mp3 desde el servidor
  • Android - Reproducción de mp3 desde byte
  • YouTube Player API en android ya no funciona bien
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.