Escucha de cambio de estado para MediaPlayer
En este diagrama hay muchos estados :
- Cambiar la vista de la superficie
- Cómo obtener la duración de Audio Stream y continuar la transmisión de audio desde cualquier punto
- No puedo reproducir video mp4 en mi aplicación para Android
- Detener Android MediaPlayer iniciado automáticamente por la página web en WebView
- Cómo identificar qué archivo MP3 terminó en MediaPlayer.OnCompletionListener?
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?
- Acceso a la caché del reproductor multimedia
- ¿Cómo evitar que el exoplayer se recargue en caso de retroceso?
- ¿Cómo sincronizar la reproducción de sonido en android?
- Reproductor multimedia no carga cuando la actividad recreada en la orientación cambia android
- Transmisión en vivo de audio retrasos mientras se reproduce en android-16?
- Android MediaMetadataRetriever devuelve valores nulos de la mayoría de las claves
- Android Video deja de reproducirse después de varias reproducciones Error 1, 2147483648
- ¿Qué en TtsService podría explicar la falta de onUtteranceCompleted () para playEarcon ()?
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) { } }
}
- Versión mínima de servicios de Google Play para la notificación de emisión
- Android: NeighboringCellInfo siempre vacío!? ¿por qué?