Android android.media.PlayerBase.PlaybackDetectionCallBack NullPointerException - PullRequest
0 голосов
/ 05 марта 2019

Мое приложение аварийно завершает работу только в телефонах vivo, и журнал ошибок выглядит так:

java.lang.NullPointerException: попытка вызвать виртуальный метод 'java.lang.String android.content.Context.getOpPackageName ()' на ссылка на нулевой объект в android.media.PlayerBase.PlaybackDetectionCallBack (PlayerBase.java:348) на android.media.PlayerBase.baseStop (PlayerBase.java:229) на android.media.MediaPlayer $ 2.onCompletion (MediaPlayer.java:3578) в android.media.MediaPlayer $ EventHandler.handleMessage (MediaPlayer.java:3351) на android.os.Handler.dispatchMessage (Handler.java:106) на android.os.Looper.loop (Looper.java:192) в android.app.ActivityThread.main (ActivityThread.java:6671) в java.lang.reflect.Method.invoke (родной метод) в com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:438) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:818)

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

Но я не могу выяснить, как это происходит, поскольку стек ошибок не извлекается из моего кода.

Вот весь мой код про игру BGM.

public void playBgm(final int resId, boolean restartIfSame) {
    if(resId == currentBgmRes && !restartIfSame) {
        if(!bgmPlayer.isPlaying()) {
            bgmPlayer.start();
        }
        return;
    }
    if(bgmPlayer.isPlaying()) {
        bgmPlayer.stop();
    }
    _playBgm(resId);
}

private void _playBgm(int resId) {
    bgmPlayer.release();
    bgmPlayer = MediaPlayer.create(this, resId);
    bgmPlayer.setLooping(true);
    currentBgmRes = resId;
    bgmPlayer.start();
}

Две функции находятся внутри class AppDelegate extends Application, поэтому this должен быть экземпляром приложения.

Это не всегда дает сбой. Так как телефон, вызывающий проблему, - какой-то далекий пользователь, я не могу получить телефон через несколько дней. Поэтому я не уверен, в какой ситуации это произойдет, но это не должно происходить ни в одной ситуации.

1 Ответ

0 голосов
/ 12 марта 2019

Я выяснил проблему.

Моя переменная MediaPlayer имеет начальное значение new MediaPlayer().

Когда Activity, играющий на фоновой музыке, вызывает onPause(), я звоню MediaPlayer.pause().

Но вызов pause() на new MediaPlayer(), кажется, вызывает сбой в некоторых устройствах, в то время как OK в других устройствах.

Я изменяю начальное значение на null, иделать нулевую проверку всякий раз, когда я использую объект.Сбой никогда не случится снова.

...