深入 MediaSessionCompat 的奇怪 NPE
Strange NPE deep inside MediaSessionCompat
我看到过关于 MediaSessionCompat
的类似问题,但它们都很老了,实际上大多数早于 AndroidX,他们指出它已在较新版本中得到修复。
androidx.media:media:1.2.1
在从 Android 8 到 11 的各种 phone 上发生了此崩溃。它始终是 MediaSessionImplApi21
。我尝试过的每个 phone 对我来说都很好。
在我发布最新版本时,这个问题对我来说是新问题。我所做的两个重大更改是,我在 MediaStyle
通知中添加了一个进度条,并且我从 1.0.0
.
升级到了 1.2.1
这是例外情况:
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
是 WeakReference
而被回收,要么一开始就设置为 null。
原来这是一个错误,现在已经修补,有望在 1.2.2
https://issuetracker.google.com/issues/178694750
上发布
我看到过关于 MediaSessionCompat
的类似问题,但它们都很老了,实际上大多数早于 AndroidX,他们指出它已在较新版本中得到修复。
androidx.media:media:1.2.1
在从 Android 8 到 11 的各种 phone 上发生了此崩溃。它始终是 MediaSessionImplApi21
。我尝试过的每个 phone 对我来说都很好。
在我发布最新版本时,这个问题对我来说是新问题。我所做的两个重大更改是,我在 MediaStyle
通知中添加了一个进度条,并且我从 1.0.0
.
1.2.1
这是例外情况:
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
是 WeakReference
而被回收,要么一开始就设置为 null。
原来这是一个错误,现在已经修补,有望在 1.2.2
https://issuetracker.google.com/issues/178694750