使用服务时MediaPlayer播放无法启动?

时间:2013-04-28 13:43:23

标签: java android service media-player

我正在制作一个流式传输音乐的应用。我正在使用service在后​​台播放来自在线mp3文件的音乐。但是服务在prepareAsync()停止并且从未完成准备,因此音乐播放不会开始。即。永远不会调用onPrepared()方法。注意:我在activity而不是service中使用相同的代码,但不会出现此问题。这有什么不对?代码:

public class mp3playerservice extends IntentService implements OnPreparedListener {
    String track;
    String info[];
    String name;
    MediaPlayer mp;
    Bundle extras;


  public mp3playerservice() {
    super("mp3playerservice");
  }

  // Will be called asynchronously be Android
  @Override
  protected void onHandleIntent(Intent intent) {
    extras = intent.getExtras();
    info=extras.getStringArray("info");
    track=info[1];
    name=info[0];
    mp= new MediaPlayer();
    if(mp.isPlaying()){
        mp.release();
        mp=new MediaPlayer();
    }
    start1(track);
    }

    void start1(String a){

        try{
        mp.setDataSource(a);
        mp.setOnPreparedListener(this);
        mp.prepareAsync();
        }catch(Exception e){
            Log.d("error is "+e.toString(),"error came up");
        }

    }


  public void onPrepared(MediaPlayer mp4){

        mp.start();
        Log.d("in here2","okay");
    }


} 

1 个答案:

答案 0 :(得分:2)

如果您还发布了正在生成的logcat,那将会很棒。但是,由于您是IntentService的子类,因此一旦您对prepareAsync()的调用完成,服务就会自动停止。原因是因为那时你已经有效地完成了对意图的处理。此时,有几种不同的方法可以解决这个问题。最快捷的方式,但不是最好的方法,是更改代码,以便调用prepare()而不是prepareAsync(),然后启动()播放器并注释掉注册onPreparedListener的行。我认为最好的方法是直接从Service子类化并覆盖onStartCommand()。