1

我在 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);
        }
    }

但这不能正常工作,每当我从其他 Activity 切换到另一个 Activity 时,缓冲区更新就会很多并且没有显示任何进展。

4

1 回答 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;
    }

}

于 2015-04-01T11:17:50.450 回答