package COM.TQC.GDD03; import android.app.Activity; import android.media.AudioManager; import android.media.MediaPlayer; import android.os.Bundle; import android.view.View; import android.widget.ImageButton; import android.widget.TextView; public class GDD03 extends Activity { private ImageButton mButtonPlay, mButtonPause, mButtonStop; private TextView mTextView; private MediaPlayer mMediaPlayer; private boolean bIsPaused = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //透過findViewById建構子建立TextView與ImageView物件 mTextView = (TextView) this.findViewById(R.id.textView1); mButtonPlay = (ImageButton) this.findViewById(R.id.imageButton1); mButtonPause = (ImageButton) this.findViewById(R.id.imageButton2); mButtonStop = (ImageButton) this.findViewById(R.id.imageButton3); mButtonStop.setEnabled(false); mButtonPause.setEnabled(false); //一開始將Stop和Pause按鈕都diable, 只允許Play按鈕enable // 執行播放音樂的按鈕 mButtonPlay.setOnClickListener(new ImageButton.OnClickListener() { //覆寫OnClick事件 public void onClick(View v) { // TODO Auto-generated method stub try { //判斷是否由暫停狀態開始播放 if(!bIsPaused) { ini(); //將音樂以Import的方式儲存在res/raw/always.mp3 //目前狀態為Stop狀態, 由於Stop狀態會release Media, 所以要再額外重新ini() Media 一次 } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { mMediaPlayer.start(); //撥放音樂 mTextView.setText(getText(R.string.str_start)); mButtonPlay.setEnabled(false); mButtonPause.setEnabled(true); mButtonStop.setEnabled(true); //當音樂播放時, enable Pause和Stop按鈕, disable Play按鈕 } } }); // 停止播放 mButtonStop.setOnClickListener(new ImageButton.OnClickListener() { // @Override public void onClick(View arg0) { // TODO Auto-generated method stub try { if (mMediaPlayer != null) { bIsPaused = false; mMediaPlayer.stop(); mMediaPlayer.release(); //將Media 資源 release mTextView.setText(getText(R.string.str_close)); mButtonPlay.setEnabled(true); mButtonPause.setEnabled(false); mButtonStop.setEnabled(false); //當停止播放時, disable Pause和Stop按鈕, enable Play按鈕 } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); // 暫停播放 mButtonPause.setOnClickListener(new ImageButton.OnClickListener() { //@Override public void onClick(View arg0) { // TODO Auto-generated method stub pauseMedia(); } }); } //初始建立Media 資源 public void ini() { mMediaPlayer = MediaPlayer.create(GDD03.this, R.raw.always); mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); //mMediaPlayer.prepare(); //特別使用註解的方式, 是為了提醒大家, 由於我們先前使用create method建立MediaPlayer //create method會自動的call prepare(), 所以我們再call prepare() method會發生 prepareAsync called in state 8的錯誤 //當MediaPlayer.OnCompletionLister會執行的Listener mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override //覆寫檔案播出完畢事件 public void onCompletion(MediaPlayer arg0) { try { bIsPaused = true; mTextView.setText("音樂播完了"); mButtonPlay.setEnabled(true); mButtonPause.setEnabled(false); mButtonStop.setEnabled(false); //當音樂播放完畢時, disable Pause和Stop按鈕, enable Play按鈕 } catch (Exception e) { mTextView.setText(e.toString()); e.printStackTrace(); } } }); //當MediaPlayer.OnErrorListener會執行的Listener mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override //p530 //覆寫錯誤處理事件 public boolean onError(MediaPlayer arg0, int arg1, int arg2) { // TODO Auto-generated method stub try { // arg1為error code分別為, // 分別為MEDIA_ERROR_UNKNOWN(1): Unspecified media player error. // MEDIA_ERROR_SERVER_DIED(100): Media server died. In this case, the application must release the MediaPlayer object and instantiate a new one. // arg2為extra code , an extra code, specific to the error. Typically implementation dependant. mMediaPlayer.release(); bIsPaused = false; } catch (Exception e) { mTextView.setText("Error Code:"+arg1+" Extra Code:"+arg2+" Error Msg:"+e.toString()); e.printStackTrace(); } return false; } }); } public void pauseMedia() { try { bIsPaused = true; mMediaPlayer.pause(); //暫停播放 mTextView.setText(getText(R.string.str_pause)); mButtonPlay.setEnabled(true); mButtonPause.setEnabled(false); mButtonStop.setEnabled(true); //當暫停播放時, disable Pause按鈕, enable Play和Stop按鈕 } catch (Exception e) { mTextView.setText(e.toString()); e.printStackTrace(); } } @Override //覆寫主程式暫停狀態事件 protected void onPause() { // TODO Auto-generated method stub super.onPause(); pauseMedia(); //當程式突然因為某些因素被迫中斷例如來電 , 我們會需要將音樂自動暫停 } }
在這邊要特別無論是在官方的開發文件或是許多教材都提到 , 在start() MediaPlayer之前必須call prepare() method , 讓MediaPlayer物件進入 Prepared state , 但是請注意 ! 如果是使用static MediaPlayer.create() 這個method 建立MediaPlayer資源的話, 這個method會自動的去call prepare() method , 如果這時候還是在start()之前去call prepare()的話會發生 prepareAsync called in state 8的錯誤。
再來是Layout檔的部分
在main.xml文件中 , 已經把三個ImageButton的圖片來源都設定好了。
P.S. 題目中所要求的Variable和Method皆會保留 , 也會根據題目所要求的流程去實作 , 縱使題目要求繞遠路....
沒有留言:
張貼留言