2015-03-31 78 views
0

以下是我的PlayerActivity.java。它有一个MediaPlayer,它接收来自之前活动的流式传输链接。 MediaPlayer工作正常,但当我按回按钮或锁定屏幕播放器停止。我希望流式传输音频,而不管正在运行的活动,甚至是屏幕锁定。如何让我的MediaPlayer Activity在后台运行?

PlayerActivity.java

package com.example.telugump3; 

import java.io.IOException; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.content.Intent; 
import android.media.AudioManager; 
import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnCompletionListener; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.PowerManager; 
import android.os.PowerManager.WakeLock; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 

public class PlayerActivity extends Activity { 
private Button btn; 
String mname; 

/** 
* help to toggle between play and pause. 
*/ 
private boolean playPause; 
private MediaPlayer mediaPlayer; 
/** 
* remain false till media is not completed, inside OnCompletionListener make it true. 
*/ 
private boolean intialStage = true; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Intent iin= getIntent(); 
    Bundle b = iin.getExtras(); 


    if(b!=null) 
    { 
     mname =(String) b.getString("song_link"); 

    } 

    setContentView(R.layout.player_activity); 
    btn = (Button) findViewById(R.id.button1); 
    mediaPlayer = new MediaPlayer(); 
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
    btn.setOnClickListener(pausePlay); 

} 


private OnClickListener pausePlay = new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     // TODO Auto-generated method stub 


     if (!playPause) { 
      btn.setBackgroundResource(R.drawable.button_pause); 
      if (intialStage) 
       new Player() 
         .execute(mname); 


      else { 
       if (!mediaPlayer.isPlaying()) 
        mediaPlayer.start(); 

      } 
      playPause = true; 
     } else { 
      btn.setBackgroundResource(R.drawable.button_play); 
      if (mediaPlayer.isPlaying()) 
       mediaPlayer.pause(); 
      playPause = false; 

     } 
    } 


}; 
/** 
* preparing mediaplayer will take sometime to buffer the content so prepare it inside the background thread and starting it on UI thread. 
* @author piyush 
* 
*/ 

class Player extends AsyncTask<String, Void, Boolean> { 
    private ProgressDialog progress; 

    @Override 
    protected Boolean doInBackground(String... params) { 
     // TODO Auto-generated method stub 
     Boolean prepared; 
     try { 

      mediaPlayer.setDataSource(params[0]); 

      mediaPlayer.setOnCompletionListener(new OnCompletionListener() { 

       @Override 
       public void onCompletion(MediaPlayer mp) { 
        // TODO Auto-generated method stub 
        intialStage = true; 
        playPause=false; 
        btn.setBackgroundResource(R.drawable.button_play); 
        mediaPlayer.stop(); 
        mediaPlayer.reset(); 
       } 
      }); 
      mediaPlayer.prepare(); 
      prepared = true; 
     } catch (IllegalArgumentException e) { 
      // TODO Auto-generated catch block 
      Log.d("IllegarArgument", e.getMessage()); 
      prepared = false; 
      e.printStackTrace(); 
     } catch (SecurityException e) { 
      // TODO Auto-generated catch block 
      prepared = false; 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      // TODO Auto-generated catch block 
      prepared = false; 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      prepared = false; 
      e.printStackTrace(); 
     } 
     return prepared; 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 
     if (progress.isShowing()) { 
      progress.cancel(); 
     } 
     Log.d("Prepared", "//" + result); 
     mediaPlayer.start(); 

     intialStage = false; 
    } 

    public Player() { 
     progress = new ProgressDialog(PlayerActivity.this); 
    } 

    @Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     super.onPreExecute(); 
     this.progress.setMessage("Buffering..."); 
     this.progress.show(); 

    } 
} 

@Override 
protected void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 
    if (mediaPlayer != null) { 
     mediaPlayer.reset(); 
     mediaPlayer.release(); 
     mediaPlayer = null; 
    } 
} 
} 
+0

不能用'Activity'来做,而应该实现一个处理媒体播放的'Service'并将其绑定到'Activity'来处理用户回调 – NitroNbg 2015-03-31 14:37:36

+0

不要在onPause中释放媒体播放器保持音乐播放 – 2015-03-31 14:45:22

+0

Folklow这个URL你可以得到你想要的。 [http://stackoverflow.com/questions/8209858/android-background-music-service][1] [1]:http://stackoverflow.com/questions/8209858/ android-background-music-service – Sadiq 2015-03-31 14:53:00

回答

0

要让它一直播放,请使用Service而不是Activity

+0

如果我使用Service,我将能够暂停它吗? – 2015-03-31 14:40:43

+0

绝对如此。 Ziem的链接解释了大部分内容(这就是为什么我没有更多阐述)。您应该仔细阅读有关“服务”的Android文档中有关“绑定服务”的内容。一个'Activity'可以绑定到'Service'并且调用它的方法。只需在'Service'中创建一个暂停实际的MediaPlayer的'pause()'方法。 – Dave 2015-03-31 15:21:01

+0

当我在那里提到'Activity'时,当你想要UI时,你需要一个'Activity'。按钮和不活在'Activity'中的'MediaPlayer'生活在'Service'中。 – Dave 2015-03-31 15:22:45