我有一个AlertDialog
,点击后停止播放声音,但在某些设备上,调用onStop()
会显示IllegalStateException
,但为什么?
如果对话框已启动,则表示正在播放声音,因此应该是音频未播放的情况。
我现在试着用它来包围它,但是这会导致什么呢?
alert.setPositiveButton("YES", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
try{
mp.stop(); //error
mp.reset();
mp.release();
}catch(Exception e){
Log.d("Nitif Activity", e.toString());
}
v.cancel();
popupMessage();
finish();
}
});
答案 0 :(得分:22)
检查mp != null
会阻止NullPointerException
,但IllegalStateException
不会导致stop()
。
您收到该错误的原因是播放器处于无法Prepared
的状态。如果您查看MediaPlayer documentation顶部的状态图,您可以看到只有在玩家处于release()
状态后才能调用停止。下一个可能性是您已经调用了reset()
或stop()
,这也会导致错误。
您只能在Prepared
,Started
,Paused
,PlaybackComplete
或Stopped
州致电prepareAsync()
。所有其他州都会产生这种错误。
所以你要么做{{1}}并且用户在你的玩家准备好之前点击按钮,或者你有代码在你按下按钮之前释放或重置玩家。
答案 1 :(得分:2)
答案 2 :(得分:1)
我猜你可能会在执行这些行之前释放你的媒体播放器。当我得到这个错误时,我喜欢这样,希望这可以解决你的问题...
if(mp != null) {
try{
mp.stop(); //error
mp.reset();
mp.release();
}catch(Exception e){
Log.d("Nitif Activity", e.toString());
}
}
答案 3 :(得分:-1)
检查mp!= null会阻止它为null,但您的媒体播放器永远不会为空。 只需添加mp = null;你在哪里做mp.stop();