Странный NPE глубоко внутри MediaSessionCompat

#android #android-notifications #android-notification.mediastyle

#Android #android-уведомления #android-notification.mediastyle

Вопрос:

Я видел похожие вопросы, MediaSessionCompat но все они довольно старые, на самом деле большинство из них предшествуют AndroidX, и они указывают на то, что это исправлено в более новых версиях.

Этот сбой происходит androidx.media:media:1.2.1 на разных телефонах с Android 8 по 11. Это всегда MediaSessionImplApi21 . У меня отлично работает на каждом телефоне, который я пробовал.

Эта проблема является новой для меня с момента моего последнего выпуска. Два больших изменения, которые я внес, это то, что я добавил индикатор выполнения в свое MediaStyle уведомление и что я обновил до 1.2.1 from 1.0.0 .

Это исключение:

 Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'android.support.v4.media.session.MediaSessionCompat$Callback android.support.v4.media.session.MediaSessionCompat$MediaSessionImplApi21.getCallback()' on a null object reference
       at android.support.v4.media.session.MediaSessionCompat$Callback$MediaSessionCallbackApi21.getSessionImplIfCallbackIsSet(MediaSessionCompat.java:1907)
       at android.support.v4.media.session.MediaSessionCompat$Callback$MediaSessionCallbackApi21.onMediaButtonEvent(MediaSessionCompat.java:1597)
       at android.media.session.MediaSession$CallbackMessageHandler.handleMessage(MediaSession.java:1471)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loop(Looper.java:214)
       at android.app.ActivityThread.main(ActivityThread.java:7094)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975)
 

Если бы мой Callback не был установлен, многие вещи не работали бы.

Также мой код выглядит так:

 MediaSessionCompat mediaSessionCompat = new MediaSessionCompat(context, TAG);
mediaSessionCompat.setCallback(mediaSessionCallback);
 

Так что на самом деле нет места, чтобы не устанавливать Callback .

Есть идеи, что это может быть?

От просмотра кода и места его сбоя:

         private MediaSessionImplApi21 getSessionImplIfCallbackIsSet() {
            MediaSessionImplApi21 sessionImpl;
            synchronized (mLock) {
                sessionImpl = (MediaSessionImplApi21) mSessionImpl.get();
            }
            return MediaSessionCompat.Callback.this == sessionImpl.getCallback()
                    ? sessionImpl : null;
        }
 

Происходит сбой sessionImpl.getCallback() . Что, вероятно, означает, что он либо был переработан, потому mSessionImpl что является a WeakReference , либо для него изначально было установлено значение null.

Ответ №1:

Оказывается, это была ошибка, и теперь она исправлена и, надеюсь, выйдет на 1.2.2 https://issuetracker.google.com/issues/178694750