点击后退按钮,MediaPlayer崩溃Android

时间:2015-02-07 05:27:44

标签: android android-service android-mediaplayer

对于MediaPlayer,我提到了http://www.androidhive.info/2012/03/android-building-audio-player-tutorial/

我为Media Player创建了活动,它具有播放,暂停,下一个,上一个,搜索栏等所有功能,还包括OnCompletionListener。一切都很棒。但现在我希望所有这些都应该由服务来管理。

我创建了MyService类:

public class MusicPlayerService extends Service {

    MediaPlayer mp;
    String fullStreamUrl;

    @Override
    public IBinder onBind(Intent arg0) {

        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mp = new MediaPlayer();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (intent != null) {
            fullStreamUrl = intent.getStringExtra("fullStreamUrl");
            // Log.d("url", "Geturl:-  " + fullStreamUrl);
        }

        try {
            mp.reset();
            mp.setDataSource(fullStreamUrl);
            mp.prepareAsync();
            mp.start();
            mp.setLooping(true);
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block 
            e.printStackTrace();
        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return 0;
    }

    @Override
    public void onDestroy() {
        mp.release();
        super.onDestroy();
    }
}

如何使用service和currentsongIndex管理所有功能。 谢谢。请清除我的怀疑。我很困惑。

3 个答案:

答案 0 :(得分:2)

从使用服务在后台运行的Activity管理MediaPlayer。您应该创建一些命令,这些命令将在活动中发生nextpreviousseekbar操作时进行广播。

如果Service在同一个进程中运行,则使用LocalBroadcastManager否则BroadcastReceiver从Activity中获取事件。

例如:

1。为服务中的下一个,上一个...操作创建操作:

  public static String STR_NEXT="MusicPlayerService.NEXT";
  public static String STR_PREV="MusicPlayerService.PREV";

2。使用onCreate中的所有操作注册接收器:

@Override
public void onCreate() {
  super.onCreate();
  mp = new MediaPlayer();
  IntentFilter filter = new IntentFilter();
  filter.addAction(STR_NEXT);
  filter.addAction(STR_PREV);   
  LocalBroadcastManager.getInstance(this).
           registerReceiver(mediaAction,filter);
}

private BroadcastReceiver mediaAction = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            if(intent.getAction().equals(STR_NEXT)){
              forwardClick();
            }
           // do same for other actions
        }
};

3. 在服务中为下一步操作创建方法:

public void forwardClick(){
  int currentPosition = mp.getCurrentPosition();
  if(currentPosition + seekForwardTime <= mp.getDuration()){
   mp.seekTo(currentPosition + seekForwardTime);
  }else{ 
   mp.seekTo(mp.getDuration());
  }
}

以相同的方式创建其他方法。

4. 从按钮上的活动点击发送广播,其中包含所需的操作:

btnForward.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View view) {
        Intent intent = new Intent(MusicPlayerService.STR_NEXT);
        LocalBroadcastManager.getInstance(
                       view.getContext()).sendBroadcast(intent);
    }
 });

以相同的方式发送广播以进行其他操作。

答案 1 :(得分:0)

on onDestroy()尝试

@Override
public void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    mp.stop();
}

答案 2 :(得分:0)

尝试浏览您的logcat消息或将其粘贴到此处,以便我们能够跟踪错误。