na tym wykresie są dużo states:zmiana słuchacz Państwowa MediaPlayer
ale ze standardowym słuchacza mogę słuchać tylko kilka podstawowych stanów.
Czy możliwe jest słuchanie wszystkich zmian stanów dla MediaPlayer?
na tym wykresie są dużo states:zmiana słuchacz Państwowa MediaPlayer
ale ze standardowym słuchacza mogę słuchać tylko kilka podstawowych stanów.
Czy możliwe jest słuchanie wszystkich zmian stanów dla MediaPlayer?
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)
{
}
}
}
Czy mógłbyś powiedzieć coś więcej? – neworld
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