Android 超簡單音樂播放器(七)拖動歌曲進度條~音量控制~
阿新 • • 發佈:2019-02-06
音量控制
通過接收廣播進行改變
設定全域性變數
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);
}