protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
File musicDir=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);
file=new File(musicDir,"朴樹 - 白樺林.mp3");
seekBar=(SeekBar) findViewById(R.id.seekBar1);
currentTv=(TextView) findViewById(R.id.TextView01);
durationTv=(TextView) findViewById(R.id.TextView02);
seekBar.setOnSeekBarChangeListener(this);
mHandler=new MainHandler();//默認當前線程Looper
}
enum States{STOP,PAUSE}
States state=States.STOP;
private MediaPlayer mPlayer;
private SeekBarThread barThread;
/**實現音樂的播放*/
public void onMusicPlay(View v){
//判定播放器對象是否爲空,爲null則創建新的對象
if(mPlayer==null){
mPlayer=new MediaPlayer();
mPlayer.setOnPreparedListener(this);
mPlayer.setOnCompletionListener(this);
}
//判定媒體播放狀態,假如是暫停則直接啓動播放
if(state==States.PAUSE){
mPlayer.start();
return;
}
//假如不是暫停狀態則設置要播放的音樂路徑,加載音樂
try{
mPlayer.setDataSource(file.getPath());
mPlayer.prepareAsync();//工作線程加載
}catch(Exception e){e.printStackTrace();}
//更新seekBar
if(barThread==null){
barThread=new SeekBarThread();
barThread.start();
}
}
private boolean isUpdate=true;
/**負責給主線程發消息,更新SeekBar的線程對象*/
class SeekBarThread extends Thread{
@Override
public void run() {
while(isUpdate){
try{sleep(1000);}catch(Exception e){}
mHandler.sendEmptyMessage(1);
}
}
}
/**實現進度條*/
private SimpleDateFormat sdf=new SimpleDateFormat("mm:ss");
class MainHandler extends Handler{
public MainHandler() {}
public MainHandler(Looper looper) {super(looper);}
@Override
public void handleMessage(Message msg) {
if(msg.what==1&&mPlayer!=null){
int cPos=mPlayer.getCurrentPosition();//獲取當前位置
seekBar.setProgress(cPos);//setMax是設置 進度條的最大值,setProgress是設置進度條的當前進度。
}
}
}
/**實現音樂的暫停*/
public void onMusicPause(View v){
if(mPlayer!=null&&mPlayer.isPlaying()){
mPlayer.pause();
state=States.PAUSE;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
isUpdate=false;
if(mPlayer!=null){
mPlayer.release();
mPlayer=null;
}
}
/**當音樂加載完成以後會執行此方法*/
@Override
public void onPrepared(MediaPlayer mp) {
Log.i("TAG", "onPrepared");
mp.start();
//getDuration()獲取歌曲長度,毫秒
durationTv.setText(sdf.format(new Date(mPlayer.getDuration())));
seekBar.setMax(mPlayer.getDuration());
}
@Override
public void onCompletion(MediaPlayer mp) {//Completion 結束
Log.i("TAG", "onCompletion");
mp.start();
}
/**以下是設置seekBar監聽,實現接口後自動添加的*/
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
currentTv.setText(sdf.format(new Date(mPlayer.getCurrentPosition())));
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
if(mPlayer!=null){
int cPos=seekBar.getProgress();
//實現跳轉到要播放的位置的功能!
mPlayer.seekTo(cPos);
}
}
實現音樂播放器,多線程處理進度條
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.