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

Slides:



Advertisements
Similar presentations
Android ADT + Android SDK Eclipse Eclipse 編輯器 JAVA JAVA 開發工具.
Advertisements

第四章 类、对象和接口.
3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
第13章 繪圖與多媒體 13-1 顯示圖檔-行動相簿 13-2 音樂播放-音樂播放器 13-3 影片播放-視訊播放器
面向对象程序设计(Java) 徐志红
MVC Servlet与MVC设计模式.
實驗五:多媒體播放器選單介面.
Part 2 開發Android應用程式的流程
位置與地圖應用 此投影片為講解Android如何取得定位經緯度和使用Google Map地圖.
第二章 B4A程式語言的開發環境 課程名稱:程式設計 授課老師:李春雄 博士
第二章 JAVA语言基础.
ArrayAdapter & Spinner
Android App 系統開發教學 Luna 陳雯琳 2014/12/18
厦门大学数据库实验室 报告人:谢荣东 导师:林子雨 2014年8月30日
實驗四:單位轉換程式.
Chapter 13 Android 實戰演練.
Android + JUnit 單元測試 建國科技大學資管系 饒瑞佶 2012/8/19V4.
實驗十三:顯示目前經緯度位置.
Ch06 再談選單元件 物件導向系統實務.
使用Android控制Arduino 史先强
Android開發環境建置與設定 Android智慧型手機程式設計 程式設計與應用班 建國科技大學 資管系 饒瑞佶 2012/4 V1
Java基础 JavaSE异常.
第一个Android程序 本讲大纲: 1、创建Android应用程序 2、Android项目结构说明 3、运行Android应用程序
第8章 Android内容提供者(ContentProvider)应用
Chapter 6 Advanced UI Design.
第四次课后作业 1 问题描述: 将谜题定义为:包含一个初始位置,一个目标位置,以及用于判断是否是有效移动的规则集。
崑山科技大學資訊管理系 伺服網頁程式設計 系統開發細部流程 教師:游峰碩.
Android智慧型手機程式設計實務應用班
Chapter 7 Android應用元件 Android應用元件可以幫助我們獲得系統資源訊息(ActivityManager)、提供系統服務(Service)、搜尋系統服務(SearchManager)、監聽Intent訊息(Broadcast Receiver)以及資料共享(ContentProvider和ContentResolver)。
Android介面設計 Android智慧型手機程式設計 建國科技大學 資管系 饒瑞佶 2012/4 V1 2012/8 V2
Chapter 6 進階UI設計.
西南科技大学网络教育系列课程 高级语程序设计(Java) 第五章 继承、接口与范型.
第4章 Android生命周期.
CH7 佈局、按鈕與文字編輯元件.
Android + Service 建國科技大學 資管系 饒瑞佶.
Android 基礎.
2018/12/3 面向对象与多线程综合实验-网络编程 教师:段鹏飞.
职责链模式.
Java语言程序设计 第五部分 Java异常处理.
實驗十四:顯示與控制地圖.
王豐緒 銘傳大學資訊工程學系 問題:JAVA 物件檔輸出入.
第2讲 移动应用开发基础知识(二) 宋婕
建立Android新專案 Android智慧型手機程式設計 程式設計與應用班 建國科技大學 資管系 饒瑞佶 2012/4 V1
第一次课后作业 1. C/C++/Java 哪些值不是头等程序对象 2. C/C++/Java 哪些机制采用的是动态束定
第6章 建立Android使用介面 6-1 介面元件的基礎 6-2 Android的事件處理 6-3 按鈕元件 6-4 文字元件
9.1 程式偵錯 9.2 捕捉例外 9.3 自行拋出例外 9.4 自定例外類別 9.5 多執行緒
Android 视频教程简介.
建國科技大學 資管系 饒瑞佶 2012/4 V1 2012/8 V2 2013/2 V3 2014/9 V4
C/C++/Java 哪些值不是头等程序对象
實驗十一:待辦事項程式 (儲存在手機上).
主编:钟元生 赵圣鲁.
《JAVA程序设计》 语音答疑 辅导老师:高旻.
Chapter 5 Basic UI Design.
Location Based Services - LBS
進階UI元件:Spinner與接合器 靜宜大學資管系 楊子青
補間動畫 (Tween Animation) 靜宜大學資管系 楊子青
第五次课后作业 1 问题描述: 将谜题定义为:包含一个初始位置,一个目标位置,以及用于判断是否是有效移动的规则集。
第二章 Java语法基础.
實驗十六:匯出APK安裝檔與軟體上架.
第二章 Java基本语法 讲师:复凡.
Java程序设计 第17章 异常和断言.
RecyclerView and CardView
Android Speech To Text(STT)
Activity的生命週期: 播放音樂與影片 靜宜大學資管系 楊子青
用Intent啟動程式中的其他Activity、運用WebView顯示網頁 靜宜大學資管系 楊子青
第2章 Java语言基础.
第9章 BroadcastReceiver的使用
控制UI界面 本讲大纲: 1、使用XML布局文件控制UI界面 2、在代码中控制UI界面 3、使用XML和Java代码混合控制UI界面
第二章 Java基础语法 北京传智播客教育
進階UI元件:Spinner與接合器 靜宜大學資管系 楊子青
Presentation transcript:

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

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

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

更改實驗八專案程式

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

編輯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 接續下頁程式

在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 接續下頁程式

自訂的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中 將第一個按鈕上的文字設定為暫停,因為音樂已開始撥放,此按鈕功能需為暫停 接續下頁程式

接續下頁程式 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 接續下頁程式

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 接續下頁程式

接續下頁程式 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 接續下頁程式

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物件資源 完成,將程式執行

Q & A