">
Download presentation
Presentation is loading. Please wait.
Published byByron West Modified over 9 years ago
1
Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1
2
Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按 home 鍵畫面離 開之後,音樂還是照播 – 如果再執行一次程式,新撥放的音樂會跟先前撥放的一起撥, 最後程式就會出錯 – 執行中的程式完全看不到! 但是,寫成 Service 就不同了 – Activity 只負責顯示, 撥放的任務則是交給 service , Service 是沒有 UI 的 ,在 trace 的時候可以用 System.out.println 來測試是否有成功呼叫。 – Service 就像是一個代理人,將可以背景執行的程序 ( 像是 MediaPlayer()) 交給他就對了
3
先試試不用 Service 撥放音樂 <LinearLayout xmlns:android="http://schemas.android.com/apk/ res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:id="@+id/Play" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text=" 開始播放 "/> <Button android:id="@+id/Stop" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text=" 停止播放 "/> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" />
4
先試試不用 Service 撥放音樂 res 中加入 – raw/test.mp3
5
先試試不用 Service 撥放音樂
6
@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(); }
7
Play
8
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(); }
9
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(); } });
10
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;
11
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;
12
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;
13
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 的結束
14
問題 產生重複撥放 無法從執行中程序停止
15
Service 流程
16
改用 Service 撥放音樂
20
public class MusicService extends Service { MediaPlayer player; @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { //Service 首先啟動 super.onCreate(); player = new MediaPlayer(); }
21
改用 Service 撥放音樂 @Override 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; }
22
改用 Service 撥放音樂 @Override public void onDestroy() { super.onDestroy(); if(player!=null){ player.stop(); player.release(); }
23
修正 AndroidManifest.xml 加入到 中
24
問題是否還在? 產生重複撥放? 無法從執行中程序停止?
25
背景音樂
26
MyBackVoice.java
27
public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); mMediaPlayer = MediaPlayer.create(this,R.raw.test); mMediaPlayer.start(); } @Override protected void onPause() { super.onPause(); mMediaPlayer.pause(); // 記得現在的位置 length = mMediaPlayer.getCurrentPosition(); }
28
@Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); mMediaPlayer.seekTo(length); mMediaPlayer.start(); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); mMediaPlayer.stop(); }
29
@Override public void onBackPressed() { return; // 讓按鍵失效,使 resume 後可以繼續撥放 } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); mMediaPlayer.seekTo(length); mMediaPlayer.start(); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); mMediaPlayer.stop(); }
30
小補充 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(); }
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.