2012-07-12 72 views
1

所以我有这个代码来流化一个MP3,现在我想知道如何当有人用后退按钮/ home按钮退出应用程序时,我如何让音乐停止。即使我退出应用程序并关闭它,音乐仍在后台播放,我无法停止播放。android编程停止mediaplayer流在退出?

package com.hrupin.streamingmedia; 

import android.app.Activity; 
import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnBufferingUpdateListener; 
import android.media.MediaPlayer.OnCompletionListener; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.View.OnTouchListener; 
import android.widget.EditText; 
import android.widget.ImageButton; 
import android.widget.SeekBar; 

import com.hrupin.media.R; 

public class StreamingMp3Player extends Activity implements OnClickListener, OnTouchListener, OnCompletionListener, OnBufferingUpdateListener{ 

    private ImageButton buttonPlayPause; 
    private SeekBar seekBarProgress; 
    public EditText editTextSongURL; 

    private MediaPlayer mediaPlayer; 
    private int mediaFileLengthInMilliseconds; // this value contains the song duration in milliseconds. Look at getDuration() method in MediaPlayer class 

    private final Handler handler = new Handler(); 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     initView(); 
    } 

    /** This method initialise all the views in project*/ 
    private void initView() { 
     buttonPlayPause = (ImageButton)findViewById(R.id.ButtonTestPlayPause); 
     buttonPlayPause.setOnClickListener(this); 

     seekBarProgress = (SeekBar)findViewById(R.id.SeekBarTestPlay); 
     seekBarProgress.setMax(99); // It means 100% .0-99 
     seekBarProgress.setOnTouchListener(this); 
     //editTextSongURL = (EditText)findViewById(R.id.EditTextSongURL); 
     //editTextSongURL.setText(R.string.testsong_20_sec); 

     mediaPlayer = new MediaPlayer(); 
     mediaPlayer.setOnBufferingUpdateListener(this); 
     mediaPlayer.setOnCompletionListener(this); 
    } 

    /** Method which updates the SeekBar primary progress by current song playing position*/ 
    private void primarySeekBarProgressUpdater() { 
     seekBarProgress.setProgress((int)(((float)mediaPlayer.getCurrentPosition()/mediaFileLengthInMilliseconds)*100)); // This math construction give a percentage of "was playing"/"song length" 
     if (mediaPlayer.isPlaying()) { 
      Runnable notification = new Runnable() { 
       public void run() { 
        primarySeekBarProgressUpdater(); 
       } 
      }; 
      handler.postDelayed(notification,1000); 
     } 
    } 

    @Override 
    public void onClick(View v) { 
     if(v.getId() == R.id.ButtonTestPlayPause){ 
      /** ImageButton onClick event handler. Method which start/pause mediaplayer playing */ 
      try { 
       mediaPlayer.setDataSource("http://www.metalgeardroid.com/music/OST.mp3"); // setup song from http://www.hrupin.com/wp-content/uploads/mp3/testsong_20_sec.mp3 URL to mediaplayer data source 
       mediaPlayer.prepare(); // you must call this method after setup the datasource in setDataSource method. After calling prepare() the instance of MediaPlayer starts load data from URL to internal buffer. 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      mediaFileLengthInMilliseconds = mediaPlayer.getDuration(); // gets the song length in milliseconds from URL 

      if(!mediaPlayer.isPlaying()){ 
       mediaPlayer.start(); 
       buttonPlayPause.setImageResource(R.drawable.button_pause); 
      }else { 
       mediaPlayer.pause(); 
       buttonPlayPause.setImageResource(R.drawable.button_play); 
      } 

      primarySeekBarProgressUpdater(); 
     } 
    } 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if(v.getId() == R.id.SeekBarTestPlay){ 
      /** Seekbar onTouch event handler. Method which seeks MediaPlayer to seekBar primary progress position*/ 
      if(mediaPlayer.isPlaying()){ 
       SeekBar sb = (SeekBar)v; 
       int playPositionInMillisecconds = (mediaFileLengthInMilliseconds/100) * sb.getProgress(); 
       mediaPlayer.seekTo(playPositionInMillisecconds); 
      } 
     } 
     return false; 
    } 

    @Override 
    public void onCompletion(MediaPlayer mp) { 
     /** MediaPlayer onCompletion event handler. Method which calls then song playing is complete*/ 
     buttonPlayPause.setImageResource(R.drawable.button_play); 
    } 

    @Override 
    public void onBufferingUpdate(MediaPlayer mp, int percent) { 
     /** Method which updates the SeekBar secondary progress by current song loading from URL position*/ 
     seekBarProgress.setSecondaryProgress(percent); 
    } 
} 

回答

0

覆盖onBackPressed方法并停止播放器。

@Override 
public void onBackPressed() { 
    if(mediaPlayer.isPlaying()) { 
     mediaPlayer.stop(); 
     } 
    super.onBackPressed(); 
} 
+0

这就是我的想法,但如果我这样做,那么后退按钮不会作为后退按钮了。就像它不会退出应用程序一样,我是否必须释放媒体播放器以允许用户通过onBackPressed停止音乐并退出应用程序。 – 2012-07-12 18:44:31

+0

我可以叫完();在OnBackPress还是那个看不起? – 2012-07-12 19:04:48

+1

对不起,我更新了答案。请致电super.onBackPressed – Snicolas 2012-07-13 05:13:53

1

覆盖了的onPause()方法

@Override 
public void onPause() { 
    if(mediaPlayer.isPlaying()) { 
     mediaPlayer.stop(); 
    } 
    super.onPause(); 
} 

当用户通过返回键,主页按钮让你的应用程序将调用此方法,或者如果他们启动其他应用程序(通过通知等)