IllegalStateException в MediaPlayer # Pause

Я загрузил свое приложение в консоль google и в отчете перед запуском только на 2 устройствах, возникла эта проблема java.lang.IllegalStateException

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)

Я не знаю что делать. Что это за проблема и что еще мне нужно загрузить, чтобы решить эту проблему.

Музыкальный класс, который используется для воспроизведения музыки в приложении и получает трансляцию, когда приложение переходит в фоновый режим, чтобы остановить музыку, и когда приложение выходит на передний план, чтобы возобновить ее, где строка 36 - player.pause ():

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();

}

что есть на Music.java:36?

rushi 29.06.2018 16:35

В 36 находится player.pause(), player = MediaPlayer.create (this, R.raw.music);

user9924189 29.06.2018 16:38

Где находится эта строка (в OnCreate?)? Кроме того, добавьте весь соответствующий код, о котором идет речь

rushi 29.06.2018 16:40

Ошибка довольно очевидна. В вашем com.wolframite.manos.crack_the_code.Music есть точка в строке 36, где, вероятно, в ответ на широковещательную передачу, вы приостанавливаете MusicPlayer, который не был инициализирован (т.е. setDataSource не был вызван или что-то в этом роде). Опубликуйте код этого класса или, если он слишком велик, код метода, в котором выполняется этот вызов.

Leo Aso 29.06.2018 16:43

@LeoAso Разместил код

user9924189 29.06.2018 16:44

Попробуйте сменить player.pause() на if (player.isPlaying()) { player.pause() } и посмотрите, решит ли это проблему.

Leo Aso 29.06.2018 16:55

@LeoAso Подойдет, но для получения результатов предварительного отчета потребуется некоторое время

user9924189 29.06.2018 17:00

@LeoAso Я только что получил результаты, но проблема не устранена

user9924189 29.06.2018 20:36

Вы также можете попробовать установить MediaPlayer.OnPreparedListener и не вызывать pause () или isPlaying (), когда проигрыватель еще не подготовлен.

algrid 30.06.2018 14:37

@algrid, что ты имеешь в виду?

user9924189 30.06.2018 22:36
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
10
722
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы избежать ошибок такого типа, вы можете создать служебный класс, который действует как безопасная оболочка для методов MediaPlayer, которые иногда вызывают неожиданное исключение и приводят к сбою вашего приложения.

Я использовал код в классе MediaPlayerUtils, как в примере ниже, чтобы избежать этих типов поведения и добавить дополнительный уровень безопасности в свои приложения:

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));
        }
    }
}

Затем вы должны использовать вместо:

player.pause(); // not safe

этот код:

MediaPlayerUtils.pause(player);  // safe

Вы можете добавить аналогичные методы для MediaPlayer.stop(), например :;

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));
        }
    }
}

Другие вопросы по теме