¿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:
- Android mediaplayer flujo de archivos mp3 en línea
- YouTube Player API en android ya no funciona bien
- Android Audio SeekBar
- Impedir mi aplicación de audio con NuPlayer en Android Lollipop 5.x?
- Android 2.2 MediaPlayer está funcionando bien con una URL de SHOUTcast, pero no con la otra
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.
- ¿Cómo desarrollar un reproductor de video que recibe transmisión de video en la difusión wi-fi / multidifusión?
- Borrar el marco de video de la vista de superficie en video completado
- Reproductor de vídeo en android (desarrollar)
- Control de reproducción de botón de pausa en fragmento de servicio de reproductor de música
- Cómo reproducir el archivo de audio Mp3 desde el servidor
- Android MediaPlayer: onErrorListener y onCompletionListener trabajando ab-normalmente
- Adición de efectos de audio personalizados al reproductor de audio de Android
- Cómo reproducir o reanudar la música de otro reproductor de música de mi código?
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 scroll mientras arrastra y suelta
- Descargar componentes SDK de Android sin el gestor SDK de Android