Exoplayer通知未清除

Exoplayer notification not clearing

基于此link,我将 exoplayer 集成到我的应用程序中。

我在 createCurrentContentIntent() 中添加了一个待定意图。

    return PendingIntent.getActivity(
        context, 0,
        Intent(context, MyActivity::class.java), 0
    )

我在这里遇到问题。我开始播放音频,播放器通知也出现在状态栏中。我的要求是即使应用程序在后台也能播放音频。所以,我还没有在 onStop() 中释放播放器。我在 onDestroy() 中添加了以下代码。

    override fun onDestroy() {
        playerNotificationManager?.setPlayer(null)
        player?.stop()
        player?.release()
        player = null
        super.onDestroy()
    }

如果我在播放器播放时从后台手动终止应用程序,通知不会关闭。因此,如果我单击通知,它将因 NullPointerException 而崩溃,因为 MyActivtity 已不存在。

有人可以提出相同的解决方案吗?

我已经实现了 ExoPlayer 以及 MediaSessionCompatMediaSessionConnector,它允许 Exo 隐式管理媒体通知(以及诸如音频焦点之类的东西)。

class MyServiceClass {

    private lateinit var player: SimpleExoPlayer
    private lateinit var playerNotificationManager: PlayerNotificationManager
    private lateinit var mediaSession: MediaSessionCompat
    private lateinit var mediaSessionConnector: MediaSessionConnector

    override fun onCreate() {
        super.onCreate()

        player = ...
        playerNotificationManager = ...
        mediaSession = MediaSessionCompat(this, CONSTANT).apply{ ..setup callback... }
        mediaSessionConnector = MediaSessionConnector(mediaSession)
        mediaSessionConnector.setPlayer(player)
        playerNotificationManager.setMediaSessionToken(mediaSession.token)
        playerNotificationManager.setPlayer(player)

    }

    override fun onDestroy() {

        mediaSession.isActive = false
        mediaSession.release()
        mediaSessionConnector.setPlayer(null)
        playerNotificationManager.setPlayer(null)
        player.release()

        super.onDestroy()
    }
}

当您终止应用程序时,这应该会处理删除通知的问题。

我还使用 PlayerNotificationReceiver 来响应系统通知的更改,这在上面的代码中被省略了。此外,在应用程序中触发和响应通知的整个部分也被省略了。

我更改了完整的实现并使用了 services。这解决了问题。