Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按 home 鍵畫面離 開之後,音樂還是照播 – 如果再執行一次程式,新撥放的音樂會跟先前撥放的一起撥,

Slides:



Advertisements
Similar presentations
FCU, Department of ECE, IC Design Research Lab. TEL: # 4945 Pre-SIm , Post-Sim.
Advertisements

: Arrange the Numbers ★★★☆☆ 題組: Contest Archive with Online Judge 題號: 11481: Arrange the Numbers 解題者:李重儀 解題日期: 2008 年 9 月 13 日 題意: 將數列 {1,2,3, …,N}
布林代數的應用--- 全及項(最小項)和全或項(最大項)展開式
Introduction to Java Programming Lecture 13 Classes I OO Programming.
建立使用案例敘述 --Use Case Narrative
:Word Morphing ★★☆☆☆ 題組: Problem Set Archive with Online Judge 題號: 10508:word morphing 解題者:楊家豪 解題日期: 2006 年 5 月 21 日 題意: 第一行給你兩個正整數, 第一個代表下面會出現幾個字串,
3Com Switch 4500 切VLAN教學.
What is static?. Static? 靜態 ? class Test { static int staticX; int instanceX; public Test(int var1, int var2) { this.staticX = var1; this.instanceX =
SIP Mobiity TA: 洪敏書
1 第一章 Word 的基本觀念 內容概要: Word 的特色 啟動與離開 Word 的方法 滑鼠游標與外型的介紹 基本操作 Word 視窗法則 使用 Word 遭遇問題時, 應如何利用軟體特 性而獲得輔助解說.
Android Class vs. Jar 建國科技大學 資管系 饒瑞佶 2013/4 V1. 從 MyAndroidProject 專案改起 將 BMI_method.java 改寫成 class 方式 步驟 1 :在原 package 內新增一個 class.
五小專案 黃詩晴 章乃云. 目錄 計算機 智慧盤 拼圖 記憶大挑戰 數學題庫 心得 參考文獻.
: ShellSort ★★☆☆☆ 題組: Problem D 題號: 10152: ShellSort 解題者:林一帆 解題日期: 2006 年 4 月 10 日 題意:烏龜王國的烏龜總是一隻一隻疊在一起。唯一改變烏龜位置 的方法為:一隻烏龜爬出他原來的位置,然後往上爬到最上方。給 你一堆烏龜原來排列的順序,以及我們想要的烏龜的排列順序,你.
1. 假設以下的敘述為一未提供 “ 捷徑計算 ” 能力的程式段,試用程 式設計的技巧,使此敘述經此改 寫的動作後,具有與 “ 捷徑計算 ” 之 處理方法相同之處理模式。 if and then E1 else E2 endif.
例外處理. 內 容 大 綱 例外的產生 捕捉例外 丟出例外 例外的產生 (1/4) 一般常見的執行時期錯誤包括整數除法分母為 0(divide by zero) ,陣列索引值越限 (array index out of range) ,輸入輸出錯誤 (I/O error) 、檔案 不存在或無法存取.
Web Meeting 使用教學 ─ 學生版.  如何即時線上與老師互動? 一. 瀏覽太御科技首頁 二. 安裝 JoinNet 在首頁的左手邊 1. 下載 JoinNet 進行安裝 JoinNet.
1 網路同步學習 如何使用中山大學管理學院知識管理平台 愷中 製作. 2 如何登入中山大學網路學習平台 1. 首先, 請輸入 2. 點選申請帳號, 依照螢幕所示, 輸入個人資訊.
南投縣社區大學 Excel 實務應用入門 講師 : 林泉成
長訊科技 EVRCOM Voice Mail System 使用者操作說明及流程. 自動總機 -- 來電語音轉接服務流程 ( 範例流程 )
Introduction to Java Programming Lecture 17 Abstract Classes & Interfaces.
第 5 章 深入 Response 物件 製作. 網頁的轉向與強制輸出 - 讓網頁轉彎的 Redirect 敘述 運用 Response 物件的 Redirect 方法,將瀏覽器顯 示的網頁,導向至其他網頁,語法如下: Response.Redirect 網頁路徑與名稱 此網頁路徑與名稱  若是導向到同一台.
24-6 設定開始與結束場景中的 程式 最後我們要替這個遊戲收個尾, 幫它把開始 的等待畫面跟結束畫面處理一下。
Chapter 20 塑模動態觀點:狀態圖 Statechart Diagram. 學習目標  說明狀態圖的目的  定義狀態圖的基本記號  展示狀態圖的建構  定義活動、內部事件及遞延事件的狀態 圖記號.
圖層的操作與管理 圖層的作用就如同一張張透明的賽璐璐片, 你可以將動畫中的每項物件, 放置在不同圖 層中, 圖層交疊就形成完整的畫面。在各圖 層中的物件, 做任何的移動或變化, 都不會 相互干擾, 所以當你編輯一個物件時, 只要 在物件所在的圖層進行操作, 將可大幅降低 製作過程的複雜度與難度。
: Happy Number ★ ? 題組: Problem Set Archive with Online Judge 題號: 10591: Happy Number 解題者:陳瀅文 解題日期: 2006 年 6 月 6 日 題意:判斷一個正整數 N 是否為 Happy Number.
影像處理學習營 練習(三)製作影片 【上】 影像處理學習營 教師 吳清月. 製作影片 學習重點 一. 利用 movie maker 軟體,編輯相片。  加上文字幕,與圖片結合。
: Fast and Easy Data Compressor ★★☆☆☆ 題組: Problem Set Archive with Online Judge 題號: 10043: Fast and Easy Data Compressor 解題者:葉貫中 解題日期: 2007 年 3.
各種線上電子資源的特異功能 SwetsWise 的 alert, TOC alert 與 Favorites 2003/4/28 修改.
行政院國家科學委員會工程技術發展處自動化學門 * 試以國立成功大學製造工程研究所 鄭芳田教授 產學合作計畫 : 智慧預測保養系統之設計與實作 成果報告盤點為範例 國科會工程處專題計畫成果典藏 自動化學門成果報告盤點範例.
各種線上電子資源的特異功能 SpringerLINK 的 Alert, Serials Update, News 2003/4/28 修改.
: Ahoy, Pirates! ★★★★☆ 題組: Contest Archive with Online Judge 題號: 11402: Ahoy, Pirates! 解題者:李重儀 解題日期: 2008 年 8 月 26 日 題意:有一個海盜島有 N 個海盜,他們的編號 (id)
1-6 動畫的文件屬性 舞台是動畫實際播放的畫面, 所以舞台的大 小與長寬比例對將來動畫的呈現有很大的 影響。 Flash 預設的舞台尺寸是 550 Pixels × 400 Pixels, 背景為白色, 如果要更改舞台大小與 背景色, 請執行『修改 / 文件』命令, 開啟文 件屬性 (Document.
:Nuts for nuts..Nuts for nuts.. ★★★★☆ 題組: Problem Set Archive with Online Judge 題號: 10944:Nuts for nuts.. 解題者:楊家豪 解題日期: 2006 年 2 月 題意: 給定兩個正整數 x,y.
從此處輸入帳號密碼登入到管理頁面. 點選進到檔案管理 點選「上傳檔案」上傳資料 點選瀏覽選擇電腦裡的檔案 可選擇公開或不公開 為平台上的資料夾 此處為檔案分類,可顯示在展示頁面上,若要參加 MY EG 競賽,做品一律上傳到 “ 98 MY EG Contest ” 點選此處確定上傳檔案.
資料結構實習-一 參數傳遞.
6-2 認識元件庫與內建元件庫 Flash 的元件庫分兩種, 一種是每個動畫專 屬的元件庫 (Library) ;另一種則是內建元 件庫 (Common Libraries), 兩者皆可透過 『視窗』功能表來開啟, 以下即為您說明。
著作權所有 © 旗標出版股份有限公司 第 21 章 文件的權限及保護 功能設定. 本章提要 設定文件讀取權限 保護文件.
Hung-Hsiang WuWindows Processing Design1 Chapter 4 簡單視窗程式 表單與標籤的屬性 按鈕與編輯的屬性 設計簡單的應用程式 表單常用事件 一般鍵盤及滑鼠常見的事件 表單視窗間的呼叫 表單間資料傳送應用 專案選擇設定.
1 Introduction to Java Programming Lecture 2: Basics of Java Programming Spring 2008.
函式 Function Part.2 東海大學物理系‧資訊教育 施奇廷. 遞迴( Recursion ) 函式可以「呼叫自己」,這種動作稱為 「遞迴」 此程式的執行結果相當於陷入無窮迴圈, 無法停止(只能按 Ctrl-C ) 這給我們一個暗示:函式的遞迴呼叫可以 達到部分迴圈的效果.
JAVA 程式設計與資料結構 第二十章 Searching. Sequential Searching Sequential Searching 是最簡單的一種搜尋法,此演 算法可應用在 Array 或是 Linked List 此等資料結構。 Sequential Searching 的 worst-case.
演算法 8-1 最大數及最小數找法 8-2 排序 8-3 二元搜尋法.
845: Gas Station Numbers ★★★ 題組: Problem Set Archive with Online Judge 題號: 845: Gas Station Numbers. 解題者:張維珊 解題日期: 2006 年 2 月 題意: 將輸入的數字,經過重新排列組合或旋轉數字,得到比原先的數字大,
Linguistics phonetic symbols. 先下載 IPA 字型檔案,執行安裝。 由於這個程式的字型目錄設定錯誤, 所以等重新開機時就會發現字型消失。 所以必須根據以下步驟來讓 Windows 加入 IPA 字型。
演算法課程 (Algorithms) 國立聯合大學 資訊管理學系 陳士杰老師 Course 7 貪婪法則 Greedy Approach.
組合語言與系統程式 軟體使用教學(中文詳細版).
概念性產品企劃書 呂學儒 李政翰.
1 Introduction to Java Programming Lecture 2: Basics of Java Programming Spring 2009.
5 重複迴圈 5.1 增減運算符號 增量運算符號 減量運算符號
第 6 章 迴圈結構 6-1 計數迴圈 6-1 計數迴圈 6-2 條件迴圈 6-2 條件迴圈 6-3 巢狀迴圈 6-3 巢狀迴圈 6-4 While/End While 迴圈 6-4 While/End While 迴圈 6-5 跳出迴圈 6-5 跳出迴圈 6-6 VB.NET 的錯誤處理 6-6 VB.NET.
Teacher : Ing-Jer Huang TA : Chien-Hung Chen 2015/6/30 Course Embedded Systems : Principles and Implementations Weekly Preview Question CH7.1~CH /12/26.
: Wine trading in Gergovia ★★☆☆☆ 題組: Contest Volumes with Online Judge 題號: 11054: Wine trading in Gergovia 解題者:劉洙愷 解題日期: 2008 年 2 月 29 日 題意:在 Gergovia.
1 Introduction to Java Programming Lecture 3 Mathematical Operators Spring 2008.
1 Introduction to Java Programming Lecture 2: Basics of Java Programming Spring 2010.
: SAM I AM ★★★★☆ 題組: Contest Archive with Online Judge 題號: 11419: SAM I AM 解題者:李重儀 解題日期: 2008 年 9 月 11 日 題意: 簡單的說,就是一個長方形的廟裡面有敵人,然 後可以橫的方向開砲或縱向開砲,每次開砲可以.
What is static? CS340100, NTHU Yoshi. Static? 靜態 ? class Test { static int staticX; int instanceX; public Test(int var1, int var2) { this.staticX = var1;
Microsoft Excel.
Introduction to Java Programming Lecture 16 Super and Sub Classes.
: Finding Paths in Grid ★★★★☆ 題組: Contest Archive with Online Judge 題號: 11486: Finding Paths in Grid 解題者:李重儀 解題日期: 2008 年 10 月 14 日 題意:給一個 7 個 column.
:Problem E.Stone Game ★★★☆☆ 題組: Problem Set Archive with Online Judge 題號: 10165: Problem E.Stone Game 解題者:李濟宇 解題日期: 2006 年 3 月 26 日 題意: Jack 與 Jim.
著作權所有 © 旗標出版股份有限公司 第 14 章 製作信封、標籤. 本章提要 製作單一信封 製作單一郵寄標籤.
1 Introduction to Java Programming Lecture 3 Mathematical Operators Spring 2009.
Failure Candidate Identification for Silicon Debug 指導教授 : 曾王道 學生 : 卜竹君 許正明.
安裝 Android 開發環境 建國科技大學 資管系 饒瑞佶 2013/2 V1. 需要 JDK ( Java Runtime 1.5 above) Eclipse IDE Android SDK ADT.
暑期專題進度. import java.io.*; import java.util.*; import javax.comm.*; public class SimpleRead implements Runnable, SerialPortEventListener { static CommPortIdentifier.
Android Service -電話錄音 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service -電話錄音 需要 – BroadcastReceiver 廣播是用來通知系統,動作或資料處理已經 完成了 例如收到一封簡訊、電池用量有變化或者 有 人打電話進來 等等 –
Android vs. JavaScript 建國科技大學資管系 饒瑞佶 2013/5. JavaScript call Java By JavascriptInterface 將 native code 寫在 JavascriptInterface 內,例 如取得方位的程式 透過 WebView.
滑動 建國科技大學 資管系 饒瑞佶 2013/4 V1 2015/5 V2.
Android Play YouTuBe 建國科技大學 資管系 饒瑞佶 2017/10 V1.
Presentation transcript:

Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1

Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按 home 鍵畫面離 開之後,音樂還是照播 – 如果再執行一次程式,新撥放的音樂會跟先前撥放的一起撥, 最後程式就會出錯 – 執行中的程式完全看不到! 但是,寫成 Service 就不同了 – Activity 只負責顯示, 撥放的任務則是交給 service , Service 是沒有 UI 的 ,在 trace 的時候可以用 System.out.println 來測試是否有成功呼叫。 – Service 就像是一個代理人,將可以背景執行的程序 ( 像是 MediaPlayer()) 交給他就對了

先試試不用 Service 撥放音樂 <LinearLayout xmlns:android=" res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text=" 開始播放 "/> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text=" 停止播放 "/> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" />

先試試不用 Service 撥放音樂 res 中加入 – raw/test.mp3

先試試不用 Service 撥放音樂

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 對應 layout 物件 buttonStart = (Button) findViewById(R.id.Play); buttonContinuePlay = (Button) findViewById(R.id.ContinuePlay); buttonPause = (Button) findViewById(R.id.Pause); buttonStop = (Button) findViewById(R.id.Stop); textState = (TextView)findViewById(R.id.tv1); // 設定 onclick 事件 buttonStart.setOnClickListener(this); buttonStop.setOnClickListener(this); buttonPause.setOnClickListener(this); buttonContinuePlay.setOnClickListener(this); // 設定物件是否可用 buttonStart.setEnabled(true); buttonContinuePlay.setEnabled(false); buttonPause.setEnabled(false); buttonStop.setEnabled(false); // 建立 mediplayer 物件 mediaPlayer = new MediaPlayer(); }

Play

public void onClick(View src) { switch (src.getId()) { case R.id.Play: mediaPlayer = MediaPlayer.create(MediaController2.this, R.raw.test); try { mediaPlayer.start(); textState.setText("- Playing -"); buttonStart.setEnabled(false); buttonContinuePlay.setEnabled(false); buttonPause.setEnabled(true); buttonStop.setEnabled(true); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); }

Play // 播放完成 mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { public void onCompletion(MediaPlayer arg0) { try { // 釋放 mediaplayer mediaPlayer.release(); textState.setText("Play end!"); // 設定物件是否可用 buttonStart.setEnabled(true); buttonContinuePlay.setEnabled(false); buttonPause.setEnabled(false); buttonStop.setEnabled(false); } catch (Exception e) { textState.setText(e.toString()); e.printStackTrace(); } });

Play // 播放錯誤 mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { public boolean onError(MediaPlayer arg0, int arg1, int arg2) { try { // 釋放 mediaplayer mediaPlayer.release(); textState.setText("Play ERROR!"); } catch (Exception e) { textState.setText(e.toString()); e.printStackTrace(); } return false; } }); break;

ContinuePlay case R.id.ContinuePlay: try { mediaPlayer.start(); textState.setText("- Playing -"); buttonStart.setEnabled(false); buttonContinuePlay.setEnabled(false); buttonPause.setEnabled(true); buttonStop.setEnabled(true); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } break;

Pause case R.id.Pause: try { mediaPlayer.pause(); textState.setText("- Pause -"); buttonStart.setEnabled(true); buttonContinuePlay.setEnabled(true); buttonPause.setEnabled(false); buttonStop.setEnabled(true); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } break;

Stop case R.id.Stop: try { mediaPlayer.stop(); textState.setText("- Stop -"); buttonStart.setEnabled(true); buttonContinuePlay.setEnabled(false); buttonPause.setEnabled(false); buttonStop.setEnabled(false); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } break; } Switch 的結束 onClick 的結束

問題 產生重複撥放 無法從執行中程序停止

Service 流程

改用 Service 撥放音樂

public class MusicService extends Service { MediaPlayer public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return null; public void onCreate() { //Service 首先啟動 super.onCreate(); player = new MediaPlayer(); }

改用 Service public void onStart(Intent intent, int startId) { // 完成 onCreate() 後啟動 if (intent != null) { Bundle bundle = intent.getExtras(); if (bundle != null) { int op = bundle.getInt("op"); switch (op) { case 1: //play player=MediaPlayer.create(this, R.raw.test) ; player.start(); break; case 2: //replay player.start(); break; case 3: //pause player.pause(); break; case 4: //stop if (player != null) { player.stop(); } break; }

改用 Service public void onDestroy() { super.onDestroy(); if(player!=null){ player.stop(); player.release(); }

修正 AndroidManifest.xml 加入到 中

問題是否還在? 產生重複撥放? 無法從執行中程序停止?

背景音樂

MyBackVoice.java

public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); mMediaPlayer = MediaPlayer.create(this,R.raw.test); mMediaPlayer.start(); protected void onPause() { super.onPause(); mMediaPlayer.pause(); // 記得現在的位置 length = mMediaPlayer.getCurrentPosition(); }

@Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); mMediaPlayer.seekTo(length); mMediaPlayer.start(); protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); mMediaPlayer.stop(); }

@Override public void onBackPressed() { return; // 讓按鍵失效,使 resume 後可以繼續撥放 protected void onResume() { // TODO Auto-generated method stub super.onResume(); mMediaPlayer.seekTo(length); mMediaPlayer.start(); protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); mMediaPlayer.stop(); }

小補充 public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); // 透過 sdcard mMediaPlayer = new MediaPlayer(); try { mMediaPlayer.setDataSource("/sdcard/test.mp3"); mMediaPlayer.prepare(); } catch (IllegalArgumentException e) { // TODO 自動產生的 catch 區塊 e.printStackTrace(); } catch (IllegalStateException e) { // TODO 自動產生的 catch 區塊 e.printStackTrace(); } catch (IOException e) { // TODO 自動產生的 catch 區塊 e.printStackTrace(); } // 透過資源檔 //mMediaPlayer = MediaPlayer.create(this,R.raw.tt); mMediaPlayer.start(); }