我已经创建了一个歌曲列表,点击了我能够使用MedaiPlayer播放歌曲的歌曲。当一首歌正在播放时,如果用户点击另一首歌,那么我将停止媒体播放器并再次启动播放器。但我在reset()中遇到非法的例外情况。这是我得到异常的代码。如何正确阻止玩家?也为什么我得到这个例外。如何避免呢?
public void stopPlayer() {
try {
if (player != null) {
// Log.e("Trying to Stop "," Player ");
player.stop();
player.release();
player.reset();// causes IllegalstateException
player = null;
}
} catch (Exception e) {
player = null;
playerStatus = false;
e.printStackTrace();
}
}
答案 0 :(得分:8)
答案 1 :(得分:6)
如果您想再次播放,请使用player.reset()
,
player.release()
表示它释放播放器对象,因此您必须重新初始化播放器。首先,您使用reset()
,然后使用release()
。当您的玩家对象不再有效时,会使用release()
。当您的活动破坏release()
方法以用于良好实践时。
每当你想要阻止它时:
if(player!=null)
{
if(player.isPlaying())
player.stop();
player.reset();//It requires again setDataSource for player object.
}
每当你的玩家不再需要时:
if(player!=null)
{
if(player.isPlaying())
player.stop();
player.reset();//It requires again setDataSource for player object.
player.release();
player=null; // fixed typo.
}
答案 2 :(得分:3)
虽然接受的答案有效,但这是实现任务的更好方法
private void stopSong() {
if(mediaPlayer!=null) {
if(mediaPlayer.isPlaying()) {
mediaPlayer.reset();// It requires again setDataSource for player object.
mediaPlayer.stop();// Stop it
mediaPlayer.release();// Release it
mediaPlayer = null; // Initialize it to null so it can be used later
}
}
}
答案 3 :(得分:0)
您是打算再次重播玩家,还是玩完玩家?如果您已完成播放器,请调用release()而不是reset()。如果您打算重新使用播放器,请调用reset()而不释放()。
reset()将播放器重置为未初始化状态。 release()释放与播放器关联的所有资源。
答案 4 :(得分:0)
Media Player State Diagram显示,并说明:
调用stop()会停止播放并导致处于Started,Paused,Prepared或PlaybackCompleted状态的MediaPlayer进入Stopped状态。
- 一旦处于Stopped状态,在调用prepare()或prepareAsync()将MediaPlayer对象再次设置为Prepared状态之前,无法开始播放。
这意味着,在调用stop()之后,如果我们想再次播放它,我们应该在同一个音频文件上调用prepare()。否则再次调用start()不会做任何事情。
由于prepare()可能抛出异常,我们应该将它包装在try-catch块中,如下所示:
public void stopAudio(View view) {
mplayer.stop();
try {
mplayer.prepare();
} catch (IOException e) {
Log.e("stopAudio", "Unable to prepare() mplayer after stop()", e);
}
}