Уведомление ExoPlayer, повторно появляющееся при приостановке проигрывателя и завершении работы приложения

#android #exoplayer #exoplayer2.x

#Android #exoplayer #exoplayer2.x

Вопрос:

Я столкнулся с очень странной проблемой при использовании PlayerNotificationManager exoplayer для отображения уведомлений игрока. Я использую следующий код для отображения уведомлений на переднем плане:

 class AudioPlayerService : LifecycleService() {
    private val notificationListener = object : PlayerNotificationManager.NotificationListener {
        override fun onNotificationPosted(
            notificationId: Int,
            notification: Notification,
            ongoing: Boolean
        ) {
            super.onNotificationPosted(notificationId, notification, ongoing)
            if (ongoing)
                startForeground(notificationId, notification)
            else
                stopForeground(false)
        }
    }

    override fun onCreate() {
        super.onCreate()
        playerNotificationManager = PlayerNotificationManager(
            this,
            CHANNEL_ID,
            NOTIFICATION_ID,
            descriptionAdapter,
            notificationListener
        ).apply {
            setFastForwardIncrementMs(0)
            setRewindIncrementMs(0)
            setUseNextAction(false)
            setUsePreviousAction(false)
            setUseStopAction(false)
            setUseChronometer(false)
        }
        //...
    }

    override fun onDestroy() {
        releasePlayer()
        super.onDestroy()
    }
    //...
}

 

Он работает, как и ожидалось, когда воспроизводится музыка и приложение отключено (удалено из формы «Недавно»), уведомление сохраняется, а музыка продолжает воспроизводиться.

Но если приостановить музыку и очистить уведомление (которое должно быть очищено, так как музыка не воспроизводится), а затем закрыть приложение, оно покажет неотменяемое уведомление (которое не должно отображаться) с помощью кнопки паузы, но кнопка паузы не работает, и звук тоже не воспроизводится.

Как я могу предотвратить отображение уведомлений, когда приложение отключено, а проигрыватель находится в состоянии паузы?

Ответ №1:

Я смог решить эту проблему, переопределив onTaskRemoved в моем сервисе.

     override fun onTaskRemoved(rootIntent: Intent?) {
        super.onTaskRemoved(rootIntent)
        if (player.isPlaying == false)
            stopForeground(true)
    }

 

Эта функция вызывается, когда пользователь удаляет задачу приложения. Здесь мы можем проверить, нужно ли нам, чтобы наш сервис продолжал работать.