1. 程式人生 > >Android 超簡單音樂播放器(七)拖動歌曲進度條~音量控制~

Android 超簡單音樂播放器(七)拖動歌曲進度條~音量控制~

音量控制

通過接收廣播進行改變

設定全域性變數

   private AudioManager mAudioManager;
    private ContentObserver mVoiceObserver;
    private MyVolumeReceiver mVolumeReceiver;

給滑動條新增改變監聽

sbVolume.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
AudioManager audioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
//系統音量和媒體音量同時更新
audioManager.setStreamVolume(AudioManager.STREAM_SYSTEM, i, 0);
audioManager.setStreamVolume(3, i, 0);// 3 代表 AudioManager.STREAM_MUSIC
}

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });

寫一個ContentObserver 來監聽音量的變化。

設定音量條的進度。

 mVoiceObserver = new ContentObserver(new Handler()) {
            @Override
public void onChange(boolean selfChange) { super.onChange(selfChange); AudioManager audioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE); sbVolume.setProgress(audioManager.getStreamVolume(AudioManager.STREAM_SYSTEM)); } };

初始化一些資料。

private void initVolume() {
        mAudioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);//獲取媒體系統服務
        sbVolume.setMax(mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC));//設定最大音量
        sbVolume.setProgress(mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC));//當前的媒體音量
        myRegisterReceiver();//註冊同步更新的廣播
    }

註冊當音量發生變化時接收的廣播

    private void myRegisterReceiver(){
        mVolumeReceiver = new MyVolumeReceiver() ;
        IntentFilter filter = new IntentFilter() ;
        filter.addAction("android.media.VOLUME_CHANGED_ACTION") ;
        getContext().registerReceiver(mVolumeReceiver, filter) ;
    }

處理音量變化時的介面顯示

 private class MyVolumeReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            //如果音量發生變化則更改seekbar的位置
            if(intent.getAction().equals("android.media.VOLUME_CHANGED_ACTION")){
                AudioManager mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
                int currVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC) ;// 當前的媒體音量
                sbVolume.setProgress(currVolume) ;
            }
        }
    }

記得要取消廣播接收器。

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        getContext().unregisterReceiver(mVolumeReceiver);
        ButterKnife.unbind(this);
    }

拖動歌曲進度條

寫一個Timer。

每一秒鐘改變一次。

 private boolean isSeekBarChanging;//互斥變數,防止進度條與定時器衝突。
     private Timer timer ;
    private TimerTask timerTask;
sbProgress.setMax(MusicUtil.getInstance().getDuration());
        timerTask = new TimerTask() {
            @Override
            public void run() {
                if(isSeekBarChanging==true) {
                    return;
                }



                sbProgress.setProgress(MusicUtil.getInstance().getCurrentPosition());
                     //更改UI介面需要切換到主執行緒中去 所以要在這裡重寫一個這個方法
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        tvCurrentTime.setText(formatTime("mm:ss",MusicUtil.getInstance().getCurrentPosition()));
                    }
                });
            }
        };
        timer = new Timer();
        timer.schedule(timerTask, 0, 1000);

為進度條設定監聽

  sbProgress.setOnSeekBarChangeListener( new MySeekbar());//新增一個改變監聽
  class MySeekbar implements SeekBar.OnSeekBarChangeListener {
        public void onProgressChanged(SeekBar seekBar, int progress,
                                      boolean fromUser) {
        }

        public void onStartTrackingTouch(SeekBar seekBar) {
            isSeekBarChanging=true;//防止滑動進度條時候起衝突
        }

        public void onStopTrackingTouch(SeekBar seekBar) {
            MusicUtil.getInstance().setSeekTo(seekBar.getProgress()); //把拖動後進度條的進度傳入然後更改歌曲播放時間
            isSeekBarChanging=false;
        }

    }

將long轉換為分秒的一個方法。

    public static String formatTime(String pattern, long milli) {
        int m = (int) (milli / DateUtils.MINUTE_IN_MILLIS);
        int s = (int) ((milli / DateUtils.SECOND_IN_MILLIS) % 60);
        String mm = String.format(Locale.getDefault(), "%02d", m);
        String ss = String.format(Locale.getDefault(), "%02d", s);
        return pattern.replace("mm", mm).replace("ss", ss);
    }