Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android MediaPlayer的状态更改侦听器_Android_Android Mediaplayer - Fatal编程技术网

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的访问。干得好。工作顺利