MusicPlayer在单击后退按钮时崩溃

时间:2014-09-25 19:14:02

标签: android android-service android-mediaplayer

我制作了一个简单的音乐播放器,可以在后台播放一些歌曲。 转到主屏幕并通过通知重新打开应用程序。

我遇到的唯一问题是,如果我在音乐播放器活动中按后退按钮(转到父活动)我的应用程序崩溃了。有两个类,活动MP3Player.java和服务MP3Service.jave。

我收到以下错误:

  

java.lang.RuntimeException:无法销毁活动{package / package.MP3Player}:java.lang.IllegalArgumentException:服务未注册:package.MP3Player$1@b135b300

你知道有什么建议吗? 提前谢谢!

EDIT1: 在我的玩家活动中,我将这样的玩家绑定在一起: MP3Player.java(活动)

playIntent = new Intent(this, MP3Service.class);
bindService(playIntent, musicConnection, Context.BIND_AUTO_CREATE);
startService(playIntent);

我使用了this教程并对其进行了修改。

编辑3: 现在我收到了这个错误:

  

java.lang.RuntimeException:无法停止服务包.MP3Service@b13a6f80:java.lang.IllegalStateException

MP3Service.java

public void onCreate() {
    super.onCreate();
    songPosn = 0;
    player = new MediaPlayer();
    initMusicPlayer();
}

public void initMusicPlayer() {
    player.setAudioStreamType(AudioManager.STREAM_MUSIC);
}

...

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}

public void setList(ArrayList<Song> theSongs) {
    songs = theSongs;
}

public class MusicBinder extends Binder {
    MP3Service getService() {
        return MP3Service.this;
    }
}

@Override
public IBinder onBind(Intent intent) {
    return musicBind;
}

@Override
public boolean onUnbind(Intent intent) {
    player.stop();
    player.release();
    return false;
}

public void playSong() {
    player.reset();

    Song playSong = songs.get(songPosn);

    try {
        player.setDataSource(getApplicationContext(),
                Uri.parse(playSong.getPath()));
    } catch (Exception e) {
        Log.e("MUSIC SERVICE", "Error setting data source", e);
    }
    player.prepareAsync();
}

public void pauseMusic() {
    if (player.isPlaying()) {
        player.pause();
        length = player.getCurrentPosition();
    }
}

public void resumeMusic() {
    if (player.isPlaying() == false) {
        player.seekTo(this.length);
        player.start();
    } else {
        Toast.makeText(getApplicationContext(),
                "Please select a song to play", Toast.LENGTH_LONG).show();
    }
}

public void stopMusic() {
    player.stop();
    player.release();
    player = null;
}

// set the song
public void setSong(int songIndex) {
    songPosn = songIndex;

}

@Override
public void onPrepared(MediaPlayer mp) {
    mp.start();
}

@Override
public void onDestroy() {
    super.onDestroy();
    if (player != null) {
        try {
            player.stop();
            player.release();
        } finally {
            player = null;
        }
    }
}

MP3Player.java

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_mp3_player);
    getActionBar().setDisplayHomeAsUpEnabled(true);

    songList = getSongList();

    listAdapter = new PlayListAdapter(this, songList);
    listMusic.setAdapter(listAdapter);

    listMusic.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int pos,
                long arg3) {
            currentSongPos = pos;
            musicSrv.setSong(currentSongPos);
            musicSrv.playSong();
        }
    });

}

private ServiceConnection musicConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        MusicBinder binder = (MusicBinder) service;
        musicSrv = binder.getService();
        musicSrv.setList(songList);
        musicBound = true;
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        musicBound = false;
    }
};

@Override
protected void onStart() {
    super.onStart();
    if (playIntent == null) {
        playIntent = new Intent(this, MP3Service.class);
        bindService(playIntent, musicConnection, Context.BIND_AUTO_CREATE);
        startService(playIntent);
    }
}


...

protected void onDestroy() {
    if (musicBound) {
        stopService(playIntent);
        unbindService(musicConnection);
        musicSrv = null;
    }
    super.onDestroy();
}

1 个答案:

答案 0 :(得分:1)

Service not registered表示在unbindService()来电期间无法提供服务。

了解服务生命周期:API Guide: Services

修改

尝试添加:

protected void onDestroy() {
  if(musicBound){
      stopService(playIntent);
      unbindService(musicConnection);
      musicSrv=null;
  }
  super.onDestroy();
}

编辑2

抱歉我的错,您需要先致电stopService(),然后再致电unbindService()

stopService()的Android文档声明:

  

请注意,如果已停止的服务仍然具有绑定到它的ServiceConnection对象并且设置了BIND_AUTO_CREATE,则不会销毁它   直到删除所有这些绑定。请参阅服务文档   有关服务生命周期的更多详细信息。