2012-10-27 14 views

Odpowiedz

4

Niestety, nie znalazłem sposobu na zrobienie tego poza otaczaniem MediaPlayer z niestandardowym kontenerem maszyny stanu.

Dodany ...

Można by utworzyć kontener, który jest pojedyncza i określa to stany własne. I tylko interakcja z MediaPlayer odbywa się za pośrednictwem tego kontenera. Wszystkie pozostałe klasy muszą uzyskać dostęp do interfejsu API kontenera.

Poniżej znajduje się prosty zarys:

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) 
    { 
    } 

} 

}

+0

Czy mógłbyś powiedzieć coś więcej? – neworld

+1

Dodałem przykład do wpisu. fyi, nawet jeśli państwo parlamentarne było publiczne, wciąż otaczałbym MP takim kontenerem tylko po to, by streścić i ograniczyć dostęp do MP. – paiego

Powiązane problemy