这是我的密码
if (player != null) {
if(player.isPlaying()){
player.pause();
player.stop();
}
player.release();
}这是错误
FATAL EXCEPTION: main
java.lang.IllegalStateException
at android.media.MediaPlayer.isPlaying(Native Method)
at com.mindefy.sindhipathshala.RecViewAdapter.mediafileRelease(RecViewAdapter.java:234)
at com.mindefy.sindhipathshala.SectionFruits.onBackPressed(SectionFruits.java:252)我是安卓系统的初学者,我对MediaPlayer的生命周期感到非常困惑。
这是从另一个onBackPressed()函数的Activity调用的适配器中的一个函数。player是一个类变量。
我在同一个文件中发布这个MediaPlayer
public void onClick(View v) {
try {
if (player != null) {
player.stop();
player.release();
}
} catch (Exception e) {
}
player = MediaPlayer.create(activityContext, soundId);
player.start();
}发布于 2016-07-02 08:49:03
问题是您没有跟踪MediaPlayer实例的状态。
在调用isPlaying()之前,您只执行null值检查,尽管仍然可以释放player (但不能释放null)。
在发布的isPlaying() MediaPlayer 实例上调用的将导致 IllegalStateException.
为了避免这种情况,您可以在发布player时将它设置为null:
player.release();
player = null;或者您可以使用boolean标志来跟踪其状态:
boolean isReleased;
// ...
player.release();
isReleased = true;因此,您可以在必要时检查此标志:
if (player != null && !isReleased) {
if(player.isPlaying()) {
// ...
}
}(不要忘记在适当的时候将其设置为false )
发布于 2018-04-24 08:29:06
添加到earthW0rmjim:我面临同样的问题(一些音频没有复制,因为一个非法的状态异常)。我所发现的是,我在一个回调中重置了我的音频对象。因此,我在重置对象之前设置了player.setDataSource(url),因为回调是在之后进行的。我的解决方案: player.reset()在setDataSource和prepareAsync的try / catch块上。
try {
player.reset(); //Important line
player.setDataSource(url);
player.prepareAsync();
} catch (Exception e) {
Log.e(Constants.AUDIO_LOG_TAG, "Error playing file " + url, e);
}再看看回调:
public void finishedPlayback(){
player.reset(); //Executing after the try / catch (sometimes)
}https://stackoverflow.com/questions/38158194
复制相似问题