Android media3 startForground 崩溃

Android media3 startForground crash

提问人:BejanCorneliu 提问时间:11/16/2023 最后编辑:BejanCorneliu 更新时间:11/16/2023 访问量:48

问:

我有一个媒体播放器应用程序。我正在使用 MediaSessionService。在 onCreate() 中,我创建了 Exoplayer 实例。

    mTrackSelector = DefaultTrackSelector(this)
    mTrackSelector.parameters = mTrackSelector.parameters
        .buildUpon()
        .setPreferredAudioLanguage("en")
        .setPreferredTextLanguage("en")
        .build()

    val mAudioAttr = AudioAttributes.Builder()
        .setUsage(C.USAGE_MEDIA)
        .setContentType(C.AUDIO_CONTENT_TYPE_SPEECH)
        .build()

    mPlayer = ExoPlayer.Builder(this)
        .setSeekBackIncrementMs(30000)
        .setSeekForwardIncrementMs(30000)
        .setTrackSelector(mTrackSelector)
        .setAudioAttributes(mAudioAttr, true)
        .setVideoScalingMode(C.VIDEO_SCALING_MODE_SCALE_TO_FIT)
        .build()

之后,我使用 ForwardingPlayer 创建 MediaSession 来调整控件

        mMediaSession = MediaSession.Builder(this, forwardingPlayer)
            .setId(System.currentTimeMillis().toString().takeLast(5))
            .setCallback(librarySessionCallback).build()

就我的测试而言,运行并发布 media3 控件通知对我的播放器来说都很好。不使用用户权限进行通知或使用推送通知。我在 android 8-14 上测试它。在模拟器中的 android 13 上测试

问题出在生产中,我收到抛出的 Firebase Crashlitycs raports 关于:

     Fatal Exception: 
android.app.RemoteServiceException$ForegroundServiceDidNotStartInTimeException
Context.startForegroundService() did not then call Service.startForeground(): 
ServiceRecord{4e0c02b u0 xx.xxxxx.PlayerService}

在 Android 13 上

我没有实现任何 MediaSessionServiceListener 并覆盖 onForegroundServiceStartNotAllowedException,因为在我在手机和模拟器上的 android 13 及更高版本上的测试中没有崩溃。对于测试,我实现了这些,但我仍然没有崩溃或任何登录

    override fun onForegroundServiceStartNotAllowedException() {
        Log.d("testCrash", "*) ------> CRASH!! CRASH!!")
    }

我做错了什么?在我的手机上,它没有崩溃 如何重现崩溃?onForegroundServiceStartNotAllowedException 未在我的手机的任何 android 13-14 上调用

在 gradle 中,我有 compileSdk 34 和 targetSdk 34

我注意到 YouTube Premium 不要求任何通知权限,我可以在我的 android 13 和 14 手机上使用后台音频

谢谢

LE:我使用以下命令启动我的服务:

 val mSessionToken = SessionToken(nInterface.getActivity(), ComponentName(nInterface.getActivity(), PlayerService::class.java))

我的AndroidManifest:

  <service android:name=".engine.notification.PlayerService"
        android:foregroundServiceType="mediaPlayback"
        android:stopWithTask="true"
        android:exported="true">
        <intent-filter>
            <action android:name="androidx.media3.session.MediaSessionService"/>
        </intent-filter>
    </service>

    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
安卓 音频 exoplayer android-media3

评论

0赞 tomerpacific 11/16/2023
有帮助吗?
0赞 BejanCorneliu 11/16/2023
我无法重现我在 firebase 报告中收到的崩溃。在我所有的手机上,应用程序都可以运行而不会崩溃。问题是:我做错了什么,或者我怎样才能重现崩溃?
0赞 Rob 11/17/2023
在您的 PlayerService 类 onStart(如果我没记错的话)中,您应该调用 this.startForeground() 并在通过 context.startForegroundService(PlayerService::class) 启动服务后的 5 秒内创建通知
0赞 BejanCorneliu 11/17/2023
我正在使用SessionToken(nInterface.getActivity(),ComponentName(nInterface.getActivity(),PlayerService::class.java))启动服务,并在我的MediaSessionService MediaSession.Builder中使用我自动接收带有控件的media3通知播放器。我不自定义管理任何通知。我所有报告的崩溃都来自三星手机。我在三星手机上测试了我的应用程序,并且没有因 ForegroundServiceDidNotStartInTimeException 而崩溃

答: 暂无答案