package codefans.app.activity;import codefans.app.util.Mp3Util;import codefans.mp3layer.R;import android.app.Activity;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.os.Bundle;import android.view.View;import android.widget.ImageButton;import android.widget.SeekBar;public class Mp3PlayerActivity extends Activity{private boolean flag = false; //播放 暫停 變數判斷private ImageButton playBt;private SeekBar seekBar;private Intent intent; //播放資訊意圖private Bundle bundle; //意圖傳遞的資訊private SeekBarReceiver receiver;private int position; //播放進度條位置@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);this.playBt = (ImageButton) findViewById(R.id.play);this.seekBar = (SeekBar) findViewById(R.id.seekBar);//意圖 啟動service使用this.intent = new Intent("codefans.action.Mp3Player");bundle = new Bundle();//註冊廣播接受器receiver = new SeekBarReceiver(); IntentFilter filter = new IntentFilter();filter.addAction("codefans.intent.action.Mp3Player");this.registerReceiver(receiver, filter);}//播放按鈕點擊public void mediaPlay(View v){if(flag == false) //改變播放按鈕表徵圖{ playBt.setImageResource(R.drawable.stop); flag = true; this.bundle.putString("filePath", "qq.mp3"); this.bundle.putInt("operate", Mp3Util.PLAY); this.intent.putExtras(bundle); startService(intent); }else{ playBt.setImageResource(R.drawable.play); flag = false; this.bundle.putInt("operate", Mp3Util.STOP); this.intent.putExtras(bundle); startService(intent); }}@Overrideprotected void onDestroy(){this.unregisterReceiver(receiver); //解除接受廣播 super.onDestroy();}/** * bindService 實現需要 這裡使用startservice * @author Codefans *//啟動服務需要類private class MyServiceConnection implements ServiceConnection{public void onServiceConnected(ComponentName name, IBinder service){Mp3PlayerActivity.this.binder = (Player) service;}public void onServiceDisconnected(ComponentName name){Mp3PlayerActivity.this.binder = null;}} *//** * 播放進度條 位置廣播接受器 * @author Codefans * */private class SeekBarReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent){ Mp3PlayerActivity.this.position = intent.getIntExtra("position", 0); // Message msg = new Message(); Mp3PlayerActivity.this.seekBar.setProgress(position); // Log.i("result", String.valueOf(position)); }}}
package codefans.app.service;import java.io.File;import java.io.IOException;import codefans.app.util.Mp3Util;import android.app.Service;import android.content.Intent;import android.media.MediaPlayer;import android.media.MediaPlayer.OnPreparedListener;import android.os.Bundle;import android.os.Environment;import android.os.IBinder;public class Mp3Service extends Service{private MediaPlayer mediaPlayer;private File musicFile;private String name;@Overridepublic void onCreate(){if (this.mediaPlayer == null){this.mediaPlayer = new MediaPlayer();}}@Overridepublic void onDestroy(){if (this.mediaPlayer != null){this.mediaPlayer.stop();this.mediaPlayer.release();this.mediaPlayer = null;}super.onDestroy();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId){Bundle bundle = intent.getExtras();switch (bundle.getInt("operate")){case Mp3Util.PLAY:this.playMusci(bundle.getString("filePath"));break;case Mp3Util.STOP:this.stop();break;}return START_STICKY;}@Overridepublic IBinder onBind(Intent intent){return null;}// 開始播放private void playMusci(String fileName){try{if (fileName.equals(name)) //播放同檔案 {this.mediaPlayer.start();}else //播放不同檔案{this.name = fileName;this.musicFile = new File(Environment.getExternalStorageDirectory(), fileName);this.mediaPlayer.reset();this.mediaPlayer.setDataSource(musicFile.getAbsolutePath());this.mediaPlayer.prepare();this.mediaPlayer.setOnPreparedListener(new MyPreParedListenner());Thread t = new SendBroadCastThread();t.start();}}catch (IllegalArgumentException e){e.printStackTrace();}catch (IllegalStateException e){e.printStackTrace();}catch (IOException e){e.printStackTrace();}}private void stop() //暫停{this.mediaPlayer.pause();}// mediaPlayer緩衝完執行事件private class MyPreParedListenner implements OnPreparedListener{public void onPrepared(MediaPlayer mp){mp.start();}}/** * 發送播放位置線程, 每隔一秒發送一次廣播 改變播放器進度條 * @author Codefans * */private class SendBroadCastThread extends Thread{@Overridepublic void run(){while(true){Intent intent = new Intent();intent.putExtra("position", Mp3Service.this.mediaPlayer.getCurrentPosition());intent.setAction("codefans.intent.action.Mp3Player");// action與接收器相同sendBroadcast(intent); //發送廣播try{Thread.sleep(1000);}catch (InterruptedException e){e.printStackTrace();}}}}/** * 建立一個內部類 Activity調用service時返回此binder * * @author Codefans * * private class Mp3IBinder extends Binder implements Player { * * public void playMusic(String filePath) { * Mp3Service.this.playMusci(filePath); } * * } */}
代碼也不知道怎麼發 都發上來了
今天主要寫了關閉Activity後台依然在唱歌 還有一個就是進度條跟隨播放 前進