Escucha de cambio de estado para MediaPlayer

En este diagrama hay muchos estados :

Estados MediaPlayer

Pero con el oyente estándar puedo escuchar sólo algunos estados básicos.

Entonces, ¿es posible escuchar todos los cambios de estados para MediaPlayer?

Desafortunadamente no encontré ninguna manera de hacer esto aparte de rodear el MediaPlayer con un contenedor de máquina de estado personalizado.

Adicional …

Puede crear un contenedor que sea un singleton y que defina sus propios estados. Y la única interacción con MediaPlayer se hace a través de este contenedor. Todas las demás clases necesitan tener acceso a la API del contenedor.

A continuación se muestra un esquema simple:

public class MyContainer implements OnBufferingUpdateListener, OnCompletionListener, OnErrorListener, OnInfoListener, OnPreparedListener { static enum MP_STATES { MPS_IDLE, MPS_INITIALIZED, MPS_PREPARING, MPS_PREPARED, MPS_STARTED, MPS_STOPPED, MPS_PAUSED, MPS_PLAYBACK_COMPLETED, MPS_ERROR, MPS_END, } private static MyContainer s_mpm = null; private MP_STATES m_eState; private MediaPlayer m_mp; public static MyContainer get() { if (null == s_mpm) { s_mpm = new MyContainer(); } return s_mpm; } private MyContainer() { m_mp = new MediaPlayer(); m_mp.setOnBufferingUpdateListener(this); m_mp.setOnCompletionListener(this); m_mp.setOnErrorListener(this); m_mp.setOnInfoListener(this); m_mp.setOnPreparedListener(this); m_eState = MP_STATES.MPS_IDLE; } public MP_STATES getState() { return m_eState; } public void setUrl(String szUrl) { bringToIdleState(); try { m_mp.setDataSource(szUrl); m_eState = MP_STATES.MPS_INITIALIZED; } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } m_mp.prepareAsync(); m_eState = MP_STATES.MPS_PREPARING; } public void play() { switch (m_eState) { case MPS_PREPARED: case MPS_PAUSED: m_mp.start(); m_eState = MP_STATES.MPS_STARTED; break; default: // !! throw exception } } public void pause() { switch (m_eState) { case MPS_STARTED: m_mp.pause(); m_eState = MP_STATES.MPS_PAUSED; break; default: // !! throw exception } } public void release() { m_mp.release(); m_mp = null; } private void bringToIdleState() { // reset() should bring MP to IDLE m_mp.reset(); m_eState = MP_STATES.MPS_IDLE; } // ** Callbacks @Override public void onPrepared(MediaPlayer mp) { m_eState = MP_STATES.MPS_PREPARED; m_mp.start(); m_eState = MP_STATES.MPS_STARTED; } @Override public boolean onInfo(MediaPlayer mp, int what, int extra) { return false; } @Override public boolean onError(MediaPlayer mp, int what, int extra) { m_eState = MP_STATES.MPS_IDLE; return false; } @Override public void onCompletion(MediaPlayer mp) { // play the next song } @Override public void onBufferingUpdate(MediaPlayer mp, int percent) { } } 

}

  • Native_window_api_connect devolvió un error: argumento no válido (-22)
  • Reproductor de audio en Android
  • Posición de control de vídeo de Android en Titanium
  • Error de MediaPlayer de Android (-38, 0) "detener llamada en estado 0"
  • MediaPlayer no está en bucle
  • Reproductor multimedia reproducir pausa en android
  • Android MediaPlayer no está dispuesto a buscar a través de la secuencia de vídeo RTSP
  • MediaPlayer: utiliza el volumen del tono de llamada en lugar del volumen del medio
  • Posiciona MediaController dentro de un Fragmento
  • Android MediaPlayer con AudioEffect: Obtención de error (-22,0)
  • Cómo acceder a la biblioteca libmediaplayerservice propia de libmedia_jni en Android Gingerbread
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.