首页 > 代码库 > android 播放音乐-进度条

android 播放音乐-进度条

今天学渣研究了一下使用MediaPlayer播放音乐时添加进度条,进度条现在用的是android自带的seekbar,后期会跟换UI的,在之前能够播放音乐的基础上,现在添加的主要功能有两个:

1实时显示播放进度

2手动调节播放进度

现在学渣新建了一个项目来进行测试,后期会和之前博客介绍的滑动页面进行整合,估计会在service建好后整合,敬请期待。。。。

好了先上效果图:


关于使用进度条的基本原理很简单,用到了几个参数

1 歌曲的时长:单位为毫秒,MediaPlayer的getDuration(),不过要注意getDuration()的使用状态,在这篇博客中介绍了MediaPlayer的各个状态,大家可以去看看。

2 进度条的长度:android里进度条的长度默认应该是100,单位不详,没影响

3 当前进度:对于歌曲而言,当前进度是当前播放的歌曲所在位置,单位毫秒,对于进度条而言,是在进度条中所占的比例。主要是对这两个进行转化。

两个功能:

1由于进度需要实时更新,因此在系统中用一个线程对UI线程发消息(每隔100毫秒),在UI线程中用Handler捕获消息,通过MediaPlayer的getCurrentPosition得到当前位置,进而计算seekbar对应的位置,对seekbar及时进行更新。

2对于手动调节歌曲进度时,通过获取调节到的位置,通过SeekBar.OnSeekBarChangeListener()监听滑动条,当滑动条调节位置确定后,通过onStopTrackingTouch()及时更新歌曲的进度,用MediaPlayer的seekTo(单位是毫秒)调节歌曲的进度。

具体代码如下:

public class MainActivity extends Activity {

	
	MediaPlayer mediaPlayer;
	
	SeekBar seekBar;
	
	//本地歌曲的路径
	String path = "/storage/sdcard1/Music/浪漫满屋.mp3";
	
	
	//处理进度条更新
	Handler mHandler = new Handler(){
		@Override  
        public void handleMessage(Message msg){  
			switch (msg.what){
			case 0:
				//更新进度
				int position = mediaPlayer.getCurrentPosition();  
	              
	            int time = mediaPlayer.getDuration();  
	            int max = seekBar.getMax();  
	              
	            seekBar.setProgress(position*max/time);  
	            break;
	        default:
	        	break;
			}
            
        }  
	};
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		init();
		//初始化播放按钮
		Button playButton = (Button)findViewById(R.id.playButton);
		playButton.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				Toast.makeText(MainActivity.this, "time is "+mediaPlayer.getDuration(), 1000).show();
				
				play();
			}
			
		});
		
		//初始化暂停按钮
		Button pauseButton = (Button)findViewById(R.id.pauseButton);	
		pauseButton.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				pause();
			}
		});
		
	    seekBar = (SeekBar)findViewById(R.id.seekbar);
		seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
			
			@Override
			public void onStopTrackingTouch(SeekBar seekBar) {
			//手动调节进度
				// TODO Auto-generated method stub
				int dest = seekBar.getProgress();
				int time = mediaPlayer.getDuration();
				int max = seekBar.getMax();
				
				mediaPlayer.seekTo(time*dest/max);
			}
			
			@Override
			public void onStartTrackingTouch(SeekBar arg0) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
				// TODO Auto-generated method stub
				
			}
		});
				
	}
//初始化音乐播放
	void init(){
		//进入Idle
		mediaPlayer = new MediaPlayer();
		try {
			//初始化
			mediaPlayer.setDataSource(path);
		    
			mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);  
			
			// prepare 通过异步的方式装载媒体资源
			mediaPlayer.prepareAsync();
			
			
			//后台线程发送消息进行更新进度条
			final int milliseconds = 100;
			new Thread(){
				@Override
				public void run(){
					while(true){  
		                try {  
		                    sleep(milliseconds);  
		                } catch (InterruptedException e) {  
		                    // TODO Auto-generated catch block  
		                    e.printStackTrace();  
		                }  
		                  
		                mHandler.sendEmptyMessage(0);  
		            }  
				}
			}.start();
			
		
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
	//测试播放音乐
	void play(){		
		mediaPlayer.start();
	}
	
	//暂停音乐   
    private void pause() {  
        if (mediaPlayer != null && mediaPlayer.isPlaying()) {  
            mediaPlayer.pause();  
        }  
    }  
	
    //activity 退出时,停止播放音乐,释放资源
	@Override
	protected void onDestroy() {
	         // 在activity结束的时候回收资源
	         if (mediaPlayer != null && mediaPlayer.isPlaying()) {
	             mediaPlayer.stop();
	             mediaPlayer.release();
	             mediaPlayer = null;
	         }
	         super.onDestroy();
   }
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}