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 クラスの外側で更新された値をチェックするための 2 つのブロードキャストです

このアプローチを使用した 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);
        }
    }

しかし、これは正しく機能せず、他のアクティビティから別のアクティビティに切り替えるたびに、バッファの更新が多くなり、進行状況が表示されません。

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 に答える