Android MediaPlayer的状态更改侦听器
在这个图表中有很多: 但是有了标准的监听器,我可以只听一些基本的状态Android MediaPlayer的状态更改侦听器,android,android-mediaplayer,Android,Android Mediaplayer,在这个图表中有很多: 但是有了标准的监听器,我可以只听一些基本的状态 那么可以监听MediaPlayer的每个状态更改吗?不幸的是,我发现除了使用自定义状态机容器包围MediaPlayer之外,没有其他方法可以做到这一点 添加 您可以创建一个单独的容器,并定义它自己的状态。与MediaPlayer的唯一交互是通过这个容器完成的。所有其他类都需要访问容器的API 以下是一个简单的概要: public class MyContainer implements OnBufferingUpdateLi
那么可以监听MediaPlayer的每个状态更改吗?不幸的是,我发现除了使用自定义状态机容器包围MediaPlayer之外,没有其他方法可以做到这一点 添加 您可以创建一个单独的容器,并定义它自己的状态。与MediaPlayer的唯一交互是通过这个容器完成的。所有其他类都需要访问容器的API 以下是一个简单的概要:
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)
{
}
}
}我在帖子中添加了一个例子。仅供参考,即使MP州是公开的,我仍然会用这样一个容器包围MP,只是为了抽象和限制对MP的访问。干得好。工作顺利