Presentation is loading. Please wait.

Presentation is loading. Please wait.

實驗九:延續實驗八, 製作一個完整音樂播放器

Similar presentations


Presentation on theme: "實驗九:延續實驗八, 製作一個完整音樂播放器"— Presentation transcript:

1 實驗九:延續實驗八, 製作一個完整音樂播放器

2 實驗九 實驗主題: 實驗目的: 環境需求: 將實驗八程式修改為一個完整音樂播放器 了解如何取得多媒體資源 了解MediaPlayer類別使用
Java SE Development Kit (JDK) Android SDK Eclipse ADT 本實驗延續實驗八 將實驗八程式修改製作成一個完整的音樂播放器

3 實驗九 實驗八會讀取sdcard目錄下的音樂檔案,並顯示在ListView上,點選檔案之後會開啟另一個活動,顯示所點選的歌曲名稱
在實驗九中要將點選的歌曲,進行播放,用進度條顯示目前播放的位置,並有暫停與停止按鈕來控制所播放的音樂 按下暫停按鍵,第一個按鈕會變成繼續播放功能,進度條會停止 按下停止按鍵或音樂播放完畢,第一個按鈕會變成播放功能,進度條進度變為0

4 更改實驗八專案程式

5 編輯res/layout/activity_play.xml 2 1 打開res/layout/activity_play.xml
在原本檔案中拖入SeekBar 再拖入水平線性排版,在水平線性排版上拖入兩個按鈕,並將按鈕上的文字改為暫停和停止

6 編輯src/Play.java 接續下頁程式 10 9 3
public class Play extends Activity implements OnClickListener, OnTouchListener, OnCompletionListener { String songStr; MediaPlayer player; SeekBar seekBar; Button playButton, stopButton; UpdateSeekBar update; Handler handler=new Handler(); protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_play); TextView songTV = (TextView)findViewById(R.id.textView1); songStr = getIntent().getStringExtra("song"); songTV.setText(songStr); playButton=(Button)findViewById(R.id.button1); stopButton=(Button)findViewById(R.id.button2); seekBar=(SeekBar)findViewById(R.id.seekBar1); playButton.setOnClickListener(this); stopButton.setOnClickListener(this); seekBar.setOnTouchListener(this); update=new UpdateSeekBar(); player=new MediaPlayer(); play(); player.setOnCompletionListener(this); } 10 9 編輯src/Play.java 3 取得元件,並設定監聽事件,事件撰寫方式請使用滑鼠點選方式自動實作對應的介面監聽器和介面中的方法 打開src/Play.java,投影片中紅色部分為實驗九新增的程式部分,輸入程式請使用Alt+/輔助鍵進行程式輸入,才不會有錯誤 3.宣告必須使用到的物件變數 MediaPlayer player; 宣告一個MediaPlayer 物件player,用來播放音樂 SeekBar seekBar; 宣告一個SeekBar物件seekBar,用來指向XML佈局中的SeekBar Button playButton, stopButton; 宣告兩個Button物件playButton和stopButton,用來指向XML佈局中的暫停和停止按鈕 UpdateSeekBar update; UpdateSeekBar 為自訂的一個Runnable類別,宣告一個UpdateSeekBar物件update,用來隨著音樂播放更新seekBar進度 Handler handler=new Handler();在UI執行緒中產生Handler物件(handler),用來將要執行的Runnable物件丟入MessageQueue中 4.利用findViewById()方法取得元件,並設定元件事件 5. 產生UpdateSeekBar 物件 6.產生MediaPlayer物件 7.呼叫自訂的paly()方法,paly()方法用來做播放相關設定,並播放音樂 8. 設定播放完事件 9. 利用滑鼠點選前述步驟程式中相關事件設定方法(setOnxxx),在跳出輔助視窗中,選取"讓Play 實作OnXXXListener",會自動產生編號9處的紅色文字 10. 點選類別名稱Play處,在跳出輔助視窗中,選取"新增未實作的方法",此時會在程式中自動加入以下方法區塊 @Override public void onClick(View v) { } public void onCompletion(MediaPlayer mp) { public boolean onTouch(View v, MotionEvent event) { return false; 後續程式會在這幾個方法區塊中加入程式 4 5 6 7 8 接續下頁程式

7 在Play.java中加入自訂的Runnable類別
11 12 class UpdateSeekBar implements Runnable{ @Override public void run() { seekBar.setProgress(player.getCurrentPosition()); handler.postDelayed(this, 1000); } 11. 接續上頁程式,自訂一個UpdateSeekBar類別並實作Runnable 12. 點選UpdateSeekBar處,在跳出輔助視窗中選取"新增未實作方法",會在UpdateSeekBar類別中加入以下方法 public void run() { // TODO 自動產生的方法 Stub } 13. 在run()方法中,利用SeekBar中的setProgress()方法更新SeekBar進度,參數為目前播放的位置,目前播放位置可透過MediaPlayer中的getCurrentPosition()方法取得 14.利用Handler的postDelayed()方法將延遲1秒後要執行的Runnable物件丟入MessageQueue中,postDelayed()方法第一個參數為要丟入MessageQueue中的Runnable物件,在此是把自己目前這個Runnable物件丟入,因次寫this,第二個參數為要延遲的毫秒數。此行程式就是每隔1秒會更新SeekBar進度 13 14 接續下頁程式

8 自訂的play()方法 接續下頁程式 歌曲檔案名稱 將MediaPlayer物件重置 取得外部儲存裝置(SdCard)的路徑 13
設定要播放的歌曲 14 準備播放 15 設定SeekBar進度條的最大值為歌曲的總長度 開始播放 13.自訂一個paly()方法區塊 14.依序輸入以下程式 player.reset(); player.setDataSource(Environment.getExternalStorageDirectory()+"/"+songStr); player.prepare(); seekBar.setMax(player.getDuration()); player.start(); handler.post(update); playButton.setText("暫停"); 15. 將滑鼠移至player.setDataSource()方法處,跳出輔助視窗,選取"以try/catch包覆" 利用handler將Runnable物件放入UI執行緒的MessageQueue中 將第一個按鈕上的文字設定為暫停,因為音樂已開始撥放,此按鈕功能需為暫停 接續下頁程式

9 接續下頁程式 16 16. 將框選處的程式移至箭頭所指處,完成後的整個paly()區塊程式如下: void play(){
player.reset(); try { player.setDataSource(Environment.getExternalStorageDirectory()+"/"+songStr); player.prepare(); seekBar.setMax(player.getDuration()); player.start(); handler.post(update); playButton.setText("暫停"); } catch (IllegalArgumentException e) { // TODO 自動產生的 catch 區塊 e.printStackTrace(); } catch (SecurityException e) { } catch (IllegalStateException e) { } catch (IOException e) { } 16 接續下頁程式

10 public boolean onTouch(View v, MotionEvent event) {
@Override public boolean onTouch(View v, MotionEvent event) { if(event.getAction()==MotionEvent.ACTION_UP) { if(player.isPlaying()) player.seekTo(seekBar.getProgress()); } return false; public void onCompletion(MediaPlayer mp) { playButton.setText("播放"); handler.removeCallbacks(update); seekBar.setProgress(0); 觸控放開時 是否正在播放 17 將歌曲播放位置移動到進度條所指示的位置 17. 當seekBar上的進度條被觸控時,會執行onTouch()方法,此方法區塊為前面步驟所自動加入的,當使用者觸控拖動進度調並放開時,若歌曲正在播放,將歌曲移至進度條位置做播放 18. 當歌曲播放完畢,會執行onCompletion()方法,此方法區塊為前面步驟所自動加入的,當播放完畢需將第一個按鈕文字改為播放,做播放功能。呼叫handler中的removeCallbacks()方法移除MessageQueue中的Runnable物件update,因為歌曲已播放完,不需更新進度條,最後將進度條的進度設定為0 18 接續下頁程式

11 接續下頁程式 public void onClick(View v) { if(v.getId()==R.id.button1){
if(player.isPlaying()){ player.pause(); handler.removeCallbacks(update); playButton.setText("繼續"); } else if(playButton.getText().equals("繼續")){ player.seekTo(seekBar.getProgress()); player.start(); handler.post(update); playButton.setText("暫停"); else{ play(); }else{ player.stop(); playButton.setText("播放"); seekBar.setProgress(0); 19 20 21 19. 當使用者按下兩個按鈕的任何一個時,會執行onClick()方法,此方法區塊為前面步驟所自動加入的,當按下第一個按鈕,且目前播放正在播放音樂,則此按鈕功能為做暫停播放歌曲動作,因此呼叫player.pause();暫停播放,呼叫handler中的removeCallbacks()方法移除MessageQueue中的Runnable物件update,因為歌曲已暫停播放,不需更新進度條,接著將第一個按鈕文字設定為"繼續",此按鈕功能變為繼續播放功能 20.當按下第一個按鈕,且按鈕文字為暫停,表示按下此按鈕的功能需為繼續播放,因此呼叫player.seekTo(seekBar.getProgress());先將音樂播放位置移動到進度條所指示的位置,呼叫player.start();開始播放,呼叫handler中的 post(update);方法將Runnable物件update放入MessageQueue,以定期更新進度條位置,最後 playButton.setText("暫停");將第一個按鈕為字改為"暫停",此按鈕功能變為暫停播放功能 21.當按下第一個按鈕,若音樂沒有播放,且按鈕上文字也不是"繼續",表示次按鈕功能為播放功能,按下後,要將歌曲重頭播放,因此呼叫paly()方法 22. 若按下的是第二個按鈕,是做停止播放功能,因此呼叫player.stop();停止播放,呼叫playButton.setText("播放");將第一個按鈕上文字改為播放,呼叫 seekBar.setProgress(0);將進度條進度設定為0,呼叫handler中的removeCallbacks()方法移除MessageQueue中的Runnable物件update,因為歌曲已停止播放,不需更新進度條 22 接續下頁程式

12 protected void onDestroy() { handler.removeCallbacks(update);
@Override protected void onDestroy() { handler.removeCallbacks(update); player.stop(); player.release(); super.onDestroy(); } 23 23. 加入onDestroy()方法區塊(使用Alt+/輔助按鍵),當此Activity關閉時,會執行此方法區塊,當此頁視窗關閉表示要將音樂停止播放並釋放資源,因此呼叫handler中的removeCallbacks()方法移除MessageQueue中的Runnable物件update,因為歌曲已停止播放,不需更新進度條,呼叫player.stop();停止播放,player.release();釋放MediaPlayer物件資源 完成,將程式執行

13 Q & A


Download ppt "實驗九:延續實驗八, 製作一個完整音樂播放器"

Similar presentations


Ads by Google