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

IllegalStateException in MediaPlayer#Pause
EN

Stack Overflow用户
提问于 2018-06-29 14:34:11
回答 1查看 1.3K关注 0票数 4

我把我的应用程序上传到google控制台,在发布前的报告中,只在两个设备中,有这个问题java.lang.IllegalStateException。

代码语言:javascript
复制
FATAL EXCEPTION: ControllerMessenger
Process: com.wolframite.manos.crack_the_code, PID: 11744
java.lang.IllegalStateException
at android.media.MediaPlayer.isPlaying(Native Method)
at com.wolframite.manos.crack_the_code.Music$1.onReceive(Music.java:36)
at android.support.v4.content.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:311)
at android.support.v4.content.LocalBroadcastManager.access$000(LocalBroadcastManager.java:47)
at android.support.v4.content.LocalBroadcastManager$1.handleMessage(LocalBroadcastManager.java:120)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.support.test.espresso.base.Interrogator.a(Interrogator.java:19)
at android.support.test.espresso.base.UiControllerImpl.a(UiControllerImpl.java:142)
at android.support.test.espresso.base.UiControllerImpl.a(UiControllerImpl.java:134)
at android.support.test.espresso.base.UiControllerImpl.a(UiControllerImpl.java:34)
at android.support.test.espresso.action.MotionEvents.a(MotionEvents.java:74)
at android.support.test.espresso.action.MotionEvents.a(MotionEvents.java:52)
at android.support.test.espresso.action.Tap.c(Tap.java:9)
at android.support.test.espresso.action.Tap.a(Tap.java:19)
at android.support.test.espresso.action.Tap$1.b(Tap.java:2)
at android.support.test.espresso.action.GeneralClickAction.perform(GeneralClickAction.java:22)
at android.support.test.espresso.ViewInteraction$SingleExecutionViewAction.perform(ViewInteraction.java:9)
at android.support.test.espresso.ViewInteraction.a(ViewInteraction.java:78)
at android.support.test.espresso.ViewInteraction.a(ViewInteraction.java:94)
at android.support.test.espresso.ViewInteraction$1.call(ViewInteraction.java:3)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.Handler.handleCallback(Handler.java:746)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5459)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

该怎么办呢。这个问题是什么,我还需要上传什么来帮助解决这个问题。

音乐类用于在应用程序中播放音乐,并在app进入后台以停止音乐时接收广播,当app进入前台继续播放时,第36行是player.pause():

代码语言:javascript
复制
public class Music extends Service {
private MediaPlayer player;

@Override
public IBinder onBind(Intent intent) {
    return null;
}
public void onCreate() {
    player = MediaPlayer.create(this, R.raw.music);
    player.setLooping(true);
    LocalBroadcastManager.getInstance(this).registerReceiver(StateReceiver, new IntentFilter("status"));

}
private final BroadcastReceiver StateReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String status = intent.getStringExtra("status");
        if (parseInt(String.valueOf(status)) == 0) {
            player.pause();
        } else if (parseInt(String.valueOf(status)) == 1) {
            if (player != null)
                player.start();
            else {
                player = MediaPlayer.create(Music.this, R.raw.music);
                player.setLooping(true);
                player.start();
            }
        } else if(player != null){
            player.stop();
            player.release();
        }

    }
};
public int onStartCommand(Intent intent, int flags, int startId) {
    player.start();
    return Service.START_NOT_STICKY;
}
public void onDestroy() {
    player.stop();
    player.release();
    LocalBroadcastManager.getInstance(this).unregisterReceiver(StateReceiver);
    stopSelf();
    super.onDestroy();

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-02 15:18:52

为了避免这些类型的错误,您可以创建一个实用工具类,它充当MediaPlayer方法的安全包装器,有时会引发意外异常并使应用程序崩溃。

我在一个名为MediaPlayerUtils的类中使用了代码,如下面的示例所示,以避免这些类型的行为,并为我的应用程序添加额外的安全层:

代码语言:javascript
复制
public static void pause(MediaPlayer mediaPlayer) {
    if (mediaPlayer != null) {
        try {
            if (mediaPlayer.isPlaying()) {
                mediaPlayer.pause();
            }
        } catch (Exception e) {
            Log.w(MediaPlayerUtil.class.getName(),
                    String.format("Failed to stop media player: %s", e));
        }
    }
}

然后,您必须使用而不是:

代码语言:javascript
复制
player.pause(); // not safe

此代码:

代码语言:javascript
复制
MediaPlayerUtils.pause(player);  // safe

您可以向for MediaPlayer.stop()添加类似的方法,例如:;

代码语言:javascript
复制
public static void stop(MediaPlayer mediaPlayer) {
    if (mediaPlayer != null) {
        try {
            if (mediaPlayer.isPlaying()) {
                mediaPlayer.stop();
            }
            resetRelease(mediaPlayer);
        } catch (Exception e) {
            Log.e(MediaPlayerUtil.class.getName(),
                    String.format("Failed to stop media player: %s", e));
        }
    }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51104076

复制
相关文章

相似问题

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