首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IllegalStateException in MediaPlayer

IllegalStateException in MediaPlayer
EN

Stack Overflow用户
提问于 2016-07-02 08:37:40
回答 2查看 5.6K关注 0票数 10

这是我的密码

代码语言:javascript
复制
if (player != null) {
    if(player.isPlaying()){
        player.pause();
        player.stop();
    }
    player.release();
}

这是错误

代码语言:javascript
复制
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

代码语言:javascript
复制
public void onClick(View v) {
    try {
        if (player != null) {
            player.stop();
            player.release();
        }
    } catch (Exception e) {
    }
    player = MediaPlayer.create(activityContext, soundId);
    player.start();
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-02 08:49:03

问题是您没有跟踪MediaPlayer实例的状态。

在调用isPlaying()之前,您只执行null值检查,尽管仍然可以释放player (但不能释放null)。

在发布的isPlaying() MediaPlayer 实例上调用的将导致 IllegalStateException.

为了避免这种情况,您可以在发布player时将它设置为null

代码语言:javascript
复制
player.release();
player = null;

或者您可以使用boolean标志来跟踪其状态:

代码语言:javascript
复制
boolean isReleased;

// ...

player.release();
isReleased = true;

因此,您可以在必要时检查此标志:

代码语言:javascript
复制
if (player != null && !isReleased) {
    if(player.isPlaying()) {
        // ...
    }
}

(不要忘记在适当的时候将其设置为false )

票数 22
EN

Stack Overflow用户

发布于 2018-04-24 08:29:06

添加到earthW0rmjim:我面临同样的问题(一些音频没有复制,因为一个非法的状态异常)。我所发现的是,我在一个回调中重置了我的音频对象。因此,我在重置对象之前设置了player.setDataSource(url),因为回调是在之后进行的。我的解决方案: player.reset()在setDataSource和prepareAsync的try / catch块上。

代码语言:javascript
复制
try {
        player.reset(); //Important line
        player.setDataSource(url);
        player.prepareAsync();

    } catch (Exception e) {
        Log.e(Constants.AUDIO_LOG_TAG, "Error playing file " + url, e);
    }

再看看回调:

代码语言:javascript
复制
public void finishedPlayback(){
    player.reset(); //Executing after the try / catch (sometimes)
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38158194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档