diff --git a/example/src/main/java/com/demo/SellyCloudSDK/live/LivePlayActivity.kt b/example/src/main/java/com/demo/SellyCloudSDK/live/LivePlayActivity.kt index c01094b..88821e3 100644 --- a/example/src/main/java/com/demo/SellyCloudSDK/live/LivePlayActivity.kt +++ b/example/src/main/java/com/demo/SellyCloudSDK/live/LivePlayActivity.kt @@ -346,10 +346,13 @@ class LivePlayActivity : AppCompatActivity() { private fun beginPlayback() { startPlaybackForegroundService() - startPlayAttempt() - resetPreviewForPlayback() - playerClient.prepareToPlay() - playerClient.play() + binding.root.post { + if (hasReleasedPlayer || isDestroyed) return@post + startPlayAttempt() + resetPreviewForPlayback() + playerClient.prepareToPlay() + playerClient.play() + } } private fun startPlaybackForegroundService() { diff --git a/example/src/main/java/com/demo/SellyCloudSDK/live/LivePlayForegroundService.kt b/example/src/main/java/com/demo/SellyCloudSDK/live/LivePlayForegroundService.kt index 53a64ac..290260f 100644 --- a/example/src/main/java/com/demo/SellyCloudSDK/live/LivePlayForegroundService.kt +++ b/example/src/main/java/com/demo/SellyCloudSDK/live/LivePlayForegroundService.kt @@ -18,17 +18,15 @@ import com.demo.SellyCloudSDK.R */ class LivePlayForegroundService : Service() { + private var hasStartedForeground = false + + override fun onCreate() { + super.onCreate() + startForegroundIfNeeded() + } + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - ServiceCompat.startForeground( - this, - NOTIFICATION_ID, - buildNotification(), - android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK - ) - } else { - startForeground(NOTIFICATION_ID, buildNotification()) - } + startForegroundIfNeeded() return START_STICKY } @@ -53,6 +51,21 @@ class LivePlayForegroundService : Service() { .build() } + private fun startForegroundIfNeeded() { + if (hasStartedForeground) return + hasStartedForeground = true + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + ServiceCompat.startForeground( + this, + NOTIFICATION_ID, + buildNotification(), + android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK + ) + } else { + startForeground(NOTIFICATION_ID, buildNotification()) + } + } + private fun ensureChannel() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val manager = getSystemService(NotificationManager::class.java) ?: return @@ -73,13 +86,23 @@ class LivePlayForegroundService : Service() { private const val NOTIFICATION_ID = 0x201 fun start(context: Context) { - val intent = Intent(context, LivePlayForegroundService::class.java) - ContextCompat.startForegroundService(context, intent) + val appContext = context.applicationContext + val intent = Intent(appContext, LivePlayForegroundService::class.java) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + try { + appContext.startService(intent) + } catch (_: IllegalStateException) { + ContextCompat.startForegroundService(appContext, intent) + } + } else { + appContext.startService(intent) + } } fun stop(context: Context) { - val intent = Intent(context, LivePlayForegroundService::class.java) - context.stopService(intent) + val appContext = context.applicationContext + val intent = Intent(appContext, LivePlayForegroundService::class.java) + appContext.stopService(intent) } } }