我在我的 crashlytics 中注意到了这个日志:
Caused by java.lang.NullPointerException: Attempt to invoke interface method 'android.media.session.ISessionController android.media.session.ISession.getController()' on a null object reference
at android.media.session.MediaSession.<init>(MediaSession.java:199)
at android.support.v4.media.session.MediaSessionCompat$MediaSessionImplApi29.createFwkMediaSession(MediaSessionCompat.java:4457)
at android.support.v4.media.session.MediaSessionCompat$MediaSessionImplApi21.<init>(MediaSessionCompat.java:3821)
at android.support.v4.media.session.MediaSessionCompat$MediaSessionImplApi22.<init>(MediaSessionCompat.java:4405)
at android.support.v4.media.session.MediaSessionCompat$MediaSessionImplApi28.<init>(MediaSessionCompat.java:4422)
at android.support.v4.media.session.MediaSessionCompat$MediaSessionImplApi29.<init>(MediaSessionCompat.java:4447)
at android.support.v4.media.session.MediaSessionCompat.<init>(MediaSessionCompat.java:576)
at android.support.v4.media.session.MediaSessionCompat.<init>(MediaSessionCompat.java:539)
at android.support.v4.media.session.MediaSessionCompat.<init>(MediaSessionCompat.java:503)
at android.support.v4.media.session.MediaSessionCompat.<init>(MediaSessionCompat.java:477)
at com.mypackage.API21VersionFactory.getMediaSessionCompat(API21VersionFactory.kt:16)
at com.mypackage.AudioPlayerService.onCreate(AudioPlayerService.kt:97)
at android.app.ActivityThread.handleCreateService(ActivityThread.java:4319)
at android.app.ActivityThread.access$1500(ActivityThread.java:263)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2010)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:240)
at android.app.ActivityThread.main(ActivityThread.java:8000)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:603)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
尝试在我的 AudioService(播放音频文件的 Android 服务)中创建音频通知样式时。
我正在以这种方式构建该通知:
NotificationCompat.Builder(this, versionFactory.getAudioPlayerNotificationChannelId(this))
.setSmallIcon(R.drawable.ic_icon3)
.setColor(ContextCompat.getColor(this, R.color.color_2))
.setColorized(true)
.setCategory(NotificationCompat.CATEGORY_TRANSPORT)
.setLargeIcon(BitmapFactory.decodeResource(resources, R.drawable.cover_art))
.setSubText(getString(R.string.audio))
.apply {
mediaSessionCompat?.let {
setStyle(
androidx.media.app.NotificationCompat.MediaStyle()
.setMediaSession(it.sessionToken)
.setShowActionsInCompactView(0)
)
}
}
为了得到我的mediaSessionCompat
,我已经声明了一个 android 版本的工厂,所以我这样得到它:
open class API21VersionFactory : DefaultAndroidVersionFactory() {
...
override fun getMediaSessionCompat(context: Context) =
MediaSessionCompat(context, "TAG")
.apply {
setMetadata(
MediaMetadataCompat.fromMediaMetadata(
MediaMetadata.Builder()
.putLong(MediaMetadata.METADATA_KEY_DURATION, -1)
.build()
)
)
}
...
我无法复制它,因为在每次测试中我都可以播放音频并且通知是可见的(并且 AudioService 已成功创建)。
我的代码有什么问题?什么是防止这种情况并在 API 21 以上版本的服务中播放音频的正确方法?
提前致谢!