3

我在我的 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 以上版本的服务中播放音频的正确方法?

提前致谢!

4

0 回答 0