我已经在Service类中实现了MediaPlayer,以便可以从任何活动中访问播放器。 由于我可以在任何活动中使用MediaPlayer,因此在从一个活动切换到另一个活动时显示缓冲区更新非常重要。

为了检测缓冲区更新,我在服务类中使用了OnInfo()方法

@Override
    public boolean onInfo(MediaPlayer mp, int what, int extra) {
        // TODO Auto-generated method stub
        if (what == MediaPlayer.MEDIA_INFO_BUFFERING_START) {
            sendBufferStartBroadcast();

        } else if (what == MediaPlayer.MEDIA_INFO_BUFFERING_END) {
            sendBufferCompleteBroadcast();
        }
        return false;
    }

这里sendBufferCompleteBroadcast()和sendBufferStartBroadcast()是两个广播,用于检查Service类外部的更新值

为了检查Activity类的更新,我使用了这种方法,

private BroadcastReceiver broadcastBufferReciever = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            showBufferProgress(intent);
        }
    };

private void showBufferProgress(Intent bufferIntent) {
        String bufferValue = bufferIntent.getStringExtra("buffer_status");
        int bufferStatus = Integer.parseInt(bufferValue);

        switch (bufferStatus) {
        case 0:
            if (progressBar != null) {
                progressBar.setVisibility(View.GONE);
                btnPlay.setVisibility(View.VISIBLE);
                changeUI();
            }
            break;
        case 1:
            progressBar.setVisibility(View.VISIBLE);
            btnPause.setVisibility(View.GONE);
            btnPlay.setVisibility(View.GONE);
        }
    }

但这无法正常工作,每当我从其他“活动”切换到另一个“活动”时,缓冲区更新就会很多,并且没有进度。

#1楼 票数:0

我使用此类设计解决了我的问题。 这不是完整的代码。 此代码就像伪代码。

public class YourService extends Service implements OnCompletionListener,
    OnClickListener, OnSeekBarChangeListener, OnBufferingUpdateListener{

    public MediaPlayer mp;
    private static WeakReference<SeekBar> songProgressBar;

    @Override
    public void onCreate() {
        mp = new MediaPlayer();
        mp.setOnCompletionListener(this);
        mp.setOnBufferingUpdateListener(this);
        mp.reset();

        songProgressBar = new WeakReference<SeekBar>(YourActivity.seekBar); // You must declare your seekbar as static at your layout activity
        songProgressBar.get().setOnSeekBarChangeListener(this);

        super.onCreate();

    }        


    @Override
    public void onBufferingUpdate(MediaPlayer mp, int percent) {
        songProgressBar.get().setSecondaryProgress(percent);
    }

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress,
        boolean fromUser) {


    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {


    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {


    }

    @Override
    public void onClick(View v) {

    }

    @Override
    public void onCompletion(MediaPlayer mp) {


    }

    @Override
    public IBinder onBind(Intent intent) {
      return null;
    }

}

  ask by Purple Lotus translate from so

未解决问题?本站智能推荐:

1回复

Android从Service类更新MediaPlayerSeekBar位置

我制作了一个流媒体MediaPlayer,它在单独的服务而不是MainActivity上运行。 为了在用户寻求进度时更新SeekBar位置,我使用了广播接收器,该服务向服务告知用户所寻求的位置。 之后,服务获取寻找位置并更新MainActivity中SeekBar的当前位置。 一切正常,
1回复

Android服务活动的回调方法

我有一项活动和一项服务。 我正在使用bindService获取Binder对象,该对象使我的活动可以访问该服务。 因此,我能够轻松地在服务上执行命令。 我需要的是一种使服务与活动通信的方法。 这是处理此问题的最佳方法,以通过活页夹返回的服务实例直接从我的活动向该服务进行调用。 然后使用
1回复

将数据从服务发送到活动而无需轮询

我有一项维护与外部系统的连接(蓝牙串行端口或TCP连接)的服务。 当在连接上接收到数据时,应将其推送到活动中,然后可以对其进行解析和显示。 考虑一下带有一些仪表的仪表板,这些仪表可以实时响应新数据。 我不希望活动轮询服务以获取数据。 我希望服务在活动到达时将数据“推送”到活动中。 如
1回复

带有MediaPlayer的Android服务被重新创建或销毁

我正在使用绑定服务,以便能够在活动和服务之间进行通信。 我绑定到onStart的服务: 等待服务绑定: 处理与服务断开连接: 在onDestroy解除服务绑定: 我的问题是,当应用程序最小化时, onDestroy立即被调用,然后Service onUnbind被调用并且音乐
2回复

如何停止使用MediaPlayer同时播放多首歌曲的服务列表中的多个android服务?

嘿,对不起,如果以前已经有人问过这个问题,但是我已经阅读了3个多小时的其他答案和文档,但是都没有成功,我真的找不到解决这个问题的方法。 描述 所以我有这个清单: private List<MusicService> songList; 并添加所有我需要的服务: 然
1回复

Android:如何将媒体播放器作为服务托管?

我有一个带有播放列表和媒体播放器 UI 的应用程序。 我遇到的问题是当我播放音乐时,我重新进入活动(使用菜单),它重新启动媒体文件(因为它从顶部调用 onCreate 方法)。 我需要将媒体播放器实现为服务,但我不知道如何做到这一点! 我在网上看到的任何地方都只是不相关且超级混乱的文章/代码。 任何
1回复

同时播放2个媒体服务

按下MainActivity上的后退按钮(称为onDestroy() )后,媒体在后台播放(使用前台服务)。 但是,在再次打开应用程序((称为它的onCreate() )之后,如果我尝试播放另一首歌曲,则第一首歌曲不会停止。两首歌曲会一起播放。如何解决此问题?对您有所帮助。 这是我的Mu
1回复

AndroidMediaPlayer在服务屏幕旋转中播放视频流

我想创建Activity with video player来播放在线流,使用MediaPlayer类和SurfaceView进行显示。 我正在单独的服务中创建MediaPlayer,因此在屏幕旋转播放器之后不必再次创建并且不必连接到流。 我的问题是我不知道如何编写Activity,所以我的