Skip to content

Commit 81444c0

Browse files
Prevent foreground service crash when app is closed
1 parent fa00ca9 commit 81444c0

1 file changed

Lines changed: 32 additions & 3 deletions

File tree

  • feature/player/src/main/java/dev/anilbeesetti/nextplayer/feature/player/service

feature/player/src/main/java/dev/anilbeesetti/nextplayer/feature/player/service/PlayerService.kt

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package dev.anilbeesetti.nextplayer.feature.player.service
22

3+
import android.app.NotificationChannel
4+
import android.app.NotificationManager
35
import android.app.PendingIntent
46
import android.content.ContentResolver
57
import android.content.Intent
68
import android.net.Uri
9+
import android.os.Build
710
import android.os.Bundle
811
import androidx.annotation.OptIn
12+
import androidx.core.app.NotificationCompat
913
import androidx.core.net.toUri
1014
import androidx.media3.common.AudioAttributes
1115
import androidx.media3.common.C
@@ -42,7 +46,6 @@ import dev.anilbeesetti.nextplayer.core.model.DecoderPriority
4246
import dev.anilbeesetti.nextplayer.core.model.LoopMode
4347
import dev.anilbeesetti.nextplayer.core.model.PlayerPreferences
4448
import dev.anilbeesetti.nextplayer.core.model.Resume
45-
import dev.anilbeesetti.nextplayer.core.ui.R as coreUiR
4649
import dev.anilbeesetti.nextplayer.feature.player.PlayerActivity
4750
import dev.anilbeesetti.nextplayer.feature.player.R
4851
import dev.anilbeesetti.nextplayer.feature.player.extensions.addAdditionalSubtitleConfiguration
@@ -58,8 +61,6 @@ import dev.anilbeesetti.nextplayer.feature.player.extensions.switchTrack
5861
import dev.anilbeesetti.nextplayer.feature.player.extensions.uriToSubtitleConfiguration
5962
import dev.anilbeesetti.nextplayer.feature.player.extensions.videoZoom
6063
import io.github.anilbeesetti.nextlib.media3ext.ffdecoder.NextRenderersFactory
61-
import java.io.File
62-
import javax.inject.Inject
6364
import kotlinx.coroutines.CoroutineScope
6465
import kotlinx.coroutines.Dispatchers
6566
import kotlinx.coroutines.SupervisorJob
@@ -71,6 +72,12 @@ import kotlinx.coroutines.guava.future
7172
import kotlinx.coroutines.launch
7273
import kotlinx.coroutines.runBlocking
7374
import kotlinx.coroutines.supervisorScope
75+
import java.io.File
76+
import javax.inject.Inject
77+
import dev.anilbeesetti.nextplayer.core.ui.R as coreUiR
78+
79+
private const val PLAYER_NOTIFICATION_CHANNEL_ID = "player_channel"
80+
private const val PLAYER_NOTIFICATION_ID = 1
7481

7582
@OptIn(UnstableApi::class)
7683
@AndroidEntryPoint
@@ -416,6 +423,28 @@ class PlayerService : MediaSessionService() {
416423

417424
override fun onCreate() {
418425
super.onCreate()
426+
427+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
428+
val channel = NotificationChannel(
429+
PLAYER_NOTIFICATION_CHANNEL_ID,
430+
"Next Player",
431+
NotificationManager.IMPORTANCE_LOW,
432+
).apply {
433+
description = "Media playback notifications"
434+
}
435+
(getSystemService(NOTIFICATION_SERVICE) as NotificationManager)
436+
.createNotificationChannel(channel)
437+
}
438+
439+
val notification = NotificationCompat.Builder(this, PLAYER_NOTIFICATION_CHANNEL_ID)
440+
.setContentTitle("Next Player")
441+
.setContentText("Playing media")
442+
.setSmallIcon(R.drawable.artwork_default)
443+
.setOngoing(true)
444+
.build()
445+
446+
startForeground(PLAYER_NOTIFICATION_ID, notification)
447+
419448
val renderersFactory = NextRenderersFactory(applicationContext)
420449
.setEnableDecoderFallback(true)
421450
.setExtensionRendererMode(

0 commit comments

Comments
 (0)