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);
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值