RcuDev / SimpleMediaPlayer

Simple Android media3 service
Apache License 2.0
110 stars 13 forks source link

Sending message to a Handler on a dead thread #3

Closed MilicTG closed 1 year ago

MilicTG commented 1 year ago

when you are playing the song and kill the app then start the app again there is this error a media source is unknown

java.lang.IllegalStateException: Handler (android.os.Handler) {d34acce} sending message to a Handler on a dead thread at android.os.MessageQueue.enqueueMessage(MessageQueue.java:574) at android.os.Handler.enqueueMessage(Handler.java:778) at android.os.Handler.sendMessageAtTime(Handler.java:727) at android.os.Handler.sendMessageDelayed(Handler.java:697) at android.os.Handler.sendMessage(Handler.java:635) at android.os.Message.sendToTarget(Message.java:482) at androidx.media3.common.util.SystemHandlerWrapper$SystemMessage.sendToTarget(SystemHandlerWrapper.java:155) at androidx.media3.exoplayer.ExoPlayerImplInternal.setMediaSources(ExoPlayerImplInternal.java:366) at androidx.media3.exoplayer.ExoPlayerImpl.setMediaSourcesInternal(ExoPlayerImpl.java:2239) at androidx.media3.exoplayer.ExoPlayerImpl.setMediaSources(ExoPlayerImpl.java:608) at androidx.media3.exoplayer.ExoPlayerImpl.setMediaItems(ExoPlayerImpl.java:571) at androidx.media3.common.BasePlayer.setMediaItems(BasePlayer.java:56) at androidx.media3.common.BasePlayer.setMediaItem(BasePlayer.java:41) at com.rcudev.player_service.service.SimpleMediaServiceHandler.addMediaItem(SimpleMediaServiceHandler.kt:27) at com.rcudev.simplemediaplayer.common.ui.SimpleMediaViewModel.loadData(SimpleMediaViewModel.kt:117) at com.rcudev.simplemediaplayer.common.ui.SimpleMediaViewModel.access$loadData(SimpleMediaViewModel.kt:22) at com.rcudev.simplemediaplayer.common.ui.SimpleMediaViewModel$1.invokeSuspend(SimpleMediaViewModel.kt:39) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.internal.DispatchedContinuationKt.resumeCancellableWith(DispatchedContinuation.kt:367) at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:30) at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable$default(Cancellable.kt:25) at kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:110) at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:126) at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch(Builders.common.kt:56) at kotlinx.coroutines.BuildersKt.launch(Unknown Source:1) at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch$default(Builders.common.kt:47) at kotlinx.coroutines.BuildersKt.launch$default(Unknown Source:1) at com.rcudev.simplemediaplayer.common.ui.SimpleMediaViewModel.<init>(SimpleMediaViewModel.kt:38) at com.rcudev.simplemediaplayer.DaggerSimpleMediaPlayerApp_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider.get(DaggerSimpleMediaPlayerApp_HiltComponents_SingletonC.java:463) at dagger.hilt.android.internal.lifecycle.HiltViewModelFactory$1.create(HiltViewModelFactory.java:102) at androidx.lifecycle.AbstractSavedStateViewModelFactory.create(AbstractSavedStateViewModelFactory.kt:90) at dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.create(HiltViewModelFactory.java:114) at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:187) at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:153) at androidx.lifecycle.ViewModelLazy.getValue(ViewModelLazy.kt:53) at androidx.lifecycle.ViewModelLazy.getValue(ViewModelLazy.kt:35) at com.rcudev.simplemediaplayer.common.ui.SimpleMediaActivity.getViewModel(SimpleMediaActivity.kt:20) at com.rcudev.simplemediaplayer.common.ui.SimpleMediaActivity.access$getViewModel(SimpleMediaActivity.kt:17) at com.rcudev.simplemediaplayer.common.ui.SimpleMediaActivity$onCreate$1$1$1$1.invoke(SimpleMediaActivity.kt:33) at com.rcudev.simplemediaplayer.common.ui.SimpleMediaActivity$onCreate$1$1$1$1.invoke(SimpleMediaActivity.kt:31) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:116) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) at androidx.navigation.compose.NavHostKt$NavHost$4$2.invoke(NavHost.kt:163) 2023-04-22 19:56:24.198 1453-1453 MessageQueue com.rcudev.simplemediaplayer W at androidx.navigation.compose.NavHostKt$NavHost$4$2.invoke(NavHost.kt:162) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228) at androidx.compose.runtime.saveable.SaveableStateHolderImpl.SaveableStateProvider(SaveableStateHolder.kt:84) at androidx.navigation.compose.NavBackStackEntryProviderKt.SaveableStateProvider(NavBackStackEntryProvider.kt:65) at androidx.navigation.compose.NavBackStackEntryProviderKt.access$SaveableStateProvider(NavBackStackEntryProvider.kt:1) at androidx.navigation.compose.NavBackStackEntryProviderKt$LocalOwnersProvider$1.invoke(NavBackStackEntryProvider.kt:52) at androidx.navigation.compose.NavBackStackEntryProviderKt$LocalOwnersProvider$1.invoke(NavBackStackEntryProvider.kt:51) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228) at androidx.navigation.compose.NavBackStackEntryProviderKt.LocalOwnersProvider(NavBackStackEntryProvider.kt:47) at androidx.navigation.compose.NavHostKt$NavHost$4.invoke(NavHost.kt:162) at androidx.navigation.compose.NavHostKt$NavHost$4.invoke(NavHost.kt:141) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:116) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) at androidx.compose.animation.CrossfadeKt$Crossfade$5$1.invoke(Crossfade.kt:133) at androidx.compose.animation.CrossfadeKt$Crossfade$5$1.invoke(Crossfade.kt:128) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) at androidx.compose.animation.CrossfadeKt.Crossfade(Crossfade.kt:142) at androidx.compose.animation.CrossfadeKt.Crossfade(Crossfade.kt:73) at androidx.navigation.compose.NavHostKt.NavHost(NavHost.kt:141) at androidx.navigation.compose.NavHostKt$NavHost$5.invoke(Unknown Source:13) at androidx.navigation.compose.NavHostKt$NavHost$5.invoke(Unknown Source:10) at androidx.compose.runtime.RecomposeScopeImpl.compose(RecomposeScopeImpl.kt:162) at androidx.compose.runtime.ComposerImpl.recomposeToGroupEnd(Composer.kt:2465) at androidx.compose.runtime.ComposerImpl.skipToGroupEnd(Composer.kt:2756) at androidx.compose.material3.TextKt.ProvideTextStyle(Text.kt:361) at androidx.compose.material3.MaterialThemeKt$MaterialTheme$1.invoke(MaterialTheme.kt:81) at androidx.compose.material3.MaterialThemeKt$MaterialTheme$1.invoke(MaterialTheme.kt:80) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228) at androidx.compose.material3.MaterialThemeKt.MaterialTheme(MaterialTheme.kt:73) at com.rcudev.simplemediaplayer.common.ui.theme.ThemeKt.SimpleMediaPlayerTheme(Theme.kt:63) at com.rcudev.simplemediaplayer.common.ui.theme.ThemeKt$SimpleMediaPlayerTheme$2.invoke(Unknown Source:17) at com.rcudev.simplemediaplayer.common.ui.theme.ThemeKt$SimpleMediaPlayerTheme$2.invoke(Unknown Source:10) at androidx.compose.runtime.RecomposeScopeImpl.compose(RecomposeScopeImpl.kt:162) at androidx.compose.runtime.ComposerImpl.recomposeToGroupEnd(Composer.kt:2465) at androidx.compose.runtime.ComposerImpl.skipToGroupEnd(Composer.kt:2756) at androidx.compose.ui.platform.AbstractComposeView$ensureCompositionCreated$1.invoke(ComposeView.android.kt:252) 2023-04-22 19:56:24.199 1453-1453 MessageQueue com.rcudev.simplemediaplayer W at androidx.compose.ui.platform.AbstractComposeView$ensureCompositionCreated$1.invoke(ComposeView.android.kt:251) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228) at androidx.compose.ui.platform.CompositionLocalsKt.ProvideCommonCompositionLocals(CompositionLocals.kt:194) at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$3.invoke(AndroidCompositionLocals.android.kt:123) at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$3.invoke(AndroidCompositionLocals.android.kt:122) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228) at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt.ProvideAndroidCompositionLocals(AndroidCompositionLocals.android.kt:114) at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$4.invoke(Unknown Source:12) at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$4.invoke(Unknown Source:10) at androidx.compose.runtime.RecomposeScopeImpl.compose(RecomposeScopeImpl.kt:162) at androidx.compose.runtime.ComposerImpl.recomposeToGroupEnd(Composer.kt:2465) at androidx.compose.runtime.ComposerImpl.skipCurrentGroup(Composer.kt:2733) at androidx.compose.runtime.ComposerImpl$doCompose$2$5.invoke(Composer.kt:3364) at androidx.compose.runtime.ComposerImpl$doCompose$2$5.invoke(Composer.kt:3342) at androidx.compose.runtime.SnapshotStateKt__DerivedStateKt.observeDerivedStateRecalculations(DerivedState.kt:341) at androidx.compose.runtime.SnapshotStateKt.observeDerivedStateRecalculations(Unknown Source:1) at androidx.compose.runtime.ComposerImpl.doCompose(Composer.kt:3342) at androidx.compose.runtime.ComposerImpl.recompose$runtime_release(Composer.kt:3307) at androidx.compose.runtime.CompositionImpl.recompose(Composition.kt:772) at androidx.compose.runtime.Recomposer.performRecompose(Recomposer.kt:1047) at androidx.compose.runtime.Recomposer.access$performRecompose(Recomposer.kt:124) at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:541) at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:510) at androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1.doFrame(AndroidUiFrameClock.android.kt:34) at androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(AndroidUiDispatcher.android.kt:109) at androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(AndroidUiDispatcher.android.kt:41) at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.doFrame(AndroidUiDispatcher.android.kt:69) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1449) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1459) at android.view.Choreographer.doCallbacks(Choreographer.java:1089) at android.view.Choreographer.doFrame(Choreographer.java:998) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1431) at android.os.Handler.handleCallback(Handler.java:942) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:210) at android.os.Looper.loop(Looper.java:299) at android.app.ActivityThread.main(ActivityThread.java:8252) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:559) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:954) 2023-04-22 19:56:24.204 1453-1453 MessageQueue com.rcudev.simplemediaplayer W Handler (android.os.Handler) {d34acce} sending message to a Handler on a dead thread java.lang.IllegalStateException: Handler (android.os.Handler) {d34acce} sending message to a Handler on a dead thread at android.os.MessageQueue.enqueueMessage(MessageQueue.java:574) at android.os.Handler.enqueueMessage(Handler.java:778) at android.os.Handler.sendMessageAtTime(Handler.java:727) at android.os.Handler.sendMessageDelayed(Handler.java:697) at android.os.Handler.sendMessage(Handler.java:635) at android.os.Message.sendToTarget(Message.java:482) at androidx.media3.common.util.SystemHandlerWrapper$SystemMessage.sendToTarget(SystemHandlerWrapper.java:155) at androidx.media3.exoplayer.ExoPlayerImplInternal.prepare(ExoPlayerImplInternal.java:315) at androidx.media3.exoplayer.ExoPlayerImpl.prepare(ExoPlayerImpl.java:539) at com.rcudev.player_service.service.SimpleMediaServiceHandler.addMediaItem(SimpleMediaServiceHandler.kt:28) at com.rcudev.simplemediaplayer.common.ui.SimpleMediaViewModel.loadData(SimpleMediaViewModel.kt:117) at com.rcudev.simplemediaplayer.common.ui.SimpleMediaViewModel.access$loadData(SimpleMediaViewModel.kt:22) at com.rcudev.simplemediaplayer.common.ui.SimpleMediaViewModel$1.invokeSuspend(SimpleMediaViewModel.kt:39) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.internal.DispatchedContinuationKt.resumeCancellableWith(DispatchedContinuation.kt:367) at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:30) at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable$default(Cancellable.kt:25) at kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:110) at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:126) at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch(Builders.common.kt:56) at kotlinx.coroutines.BuildersKt.launch(Unknown Source:1) at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch$default(Builders.common.kt:47) at kotlinx.coroutines.BuildersKt.launch$default(Unknown Source:1) at com.rcudev.simplemediaplayer.common.ui.SimpleMediaViewModel.<init>(SimpleMediaViewModel.kt:38) at com.rcudev.simplemediaplayer.DaggerSimpleMediaPlayerApp_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider.get(DaggerSimpleMediaPlayerApp_HiltComponents_SingletonC.java:463) at dagger.hilt.android.internal.lifecycle.HiltViewModelFactory$1.create(HiltViewModelFactory.java:102) at androidx.lifecycle.AbstractSavedStateViewModelFactory.create(AbstractSavedStateViewModelFactory.kt:90) at dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.create(HiltViewModelFactory.java:114) at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:187) at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:153) at androidx.lifecycle.ViewModelLazy.getValue(ViewModelLazy.kt:53) at androidx.lifecycle.ViewModelLazy.getValue(ViewModelLazy.kt:35) at com.rcudev.simplemediaplayer.common.ui.SimpleMediaActivity.getViewModel(SimpleMediaActivity.kt:20) at com.rcudev.simplemediaplayer.common.ui.SimpleMediaActivity.access$getViewModel(SimpleMediaActivity.kt:17) at com.rcudev.simplemediaplayer.common.ui.SimpleMediaActivity$onCreate$1$1$1$1.invoke(SimpleMediaActivity.kt:33) at com.rcudev.simplemediaplayer.common.ui.SimpleMediaActivity$onCreate$1$1$1$1.invoke(SimpleMediaActivity.kt:31) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:116) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) at androidx.navigation.compose.NavHostKt$NavHost$4$2.invoke(NavHost.kt:163) at androidx.navigation.compose.NavHostKt$NavHost$4$2.invoke(NavHost.kt:162) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) 2023-04-22 19:56:24.204 1453-1453 MessageQueue com.rcudev.simplemediaplayer W at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228) at androidx.compose.runtime.saveable.SaveableStateHolderImpl.SaveableStateProvider(SaveableStateHolder.kt:84) at androidx.navigation.compose.NavBackStackEntryProviderKt.SaveableStateProvider(NavBackStackEntryProvider.kt:65) at androidx.navigation.compose.NavBackStackEntryProviderKt.access$SaveableStateProvider(NavBackStackEntryProvider.kt:1) at androidx.navigation.compose.NavBackStackEntryProviderKt$LocalOwnersProvider$1.invoke(NavBackStackEntryProvider.kt:52) at androidx.navigation.compose.NavBackStackEntryProviderKt$LocalOwnersProvider$1.invoke(NavBackStackEntryProvider.kt:51) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228) at androidx.navigation.compose.NavBackStackEntryProviderKt.LocalOwnersProvider(NavBackStackEntryProvider.kt:47) at androidx.navigation.compose.NavHostKt$NavHost$4.invoke(NavHost.kt:162) at androidx.navigation.compose.NavHostKt$NavHost$4.invoke(NavHost.kt:141) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:116) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) at androidx.compose.animation.CrossfadeKt$Crossfade$5$1.invoke(Crossfade.kt:133) at androidx.compose.animation.CrossfadeKt$Crossfade$5$1.invoke(Crossfade.kt:128) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) at androidx.compose.animation.CrossfadeKt.Crossfade(Crossfade.kt:142) at androidx.compose.animation.CrossfadeKt.Crossfade(Crossfade.kt:73) at androidx.navigation.compose.NavHostKt.NavHost(NavHost.kt:141) at androidx.navigation.compose.NavHostKt$NavHost$5.invoke(Unknown Source:13) at androidx.navigation.compose.NavHostKt$NavHost$5.invoke(Unknown Source:10) at androidx.compose.runtime.RecomposeScopeImpl.compose(RecomposeScopeImpl.kt:162) at androidx.compose.runtime.ComposerImpl.recomposeToGroupEnd(Composer.kt:2465) at androidx.compose.runtime.ComposerImpl.skipToGroupEnd(Composer.kt:2756) at androidx.compose.material3.TextKt.ProvideTextStyle(Text.kt:361) at androidx.compose.material3.MaterialThemeKt$MaterialTheme$1.invoke(MaterialTheme.kt:81) at androidx.compose.material3.MaterialThemeKt$MaterialTheme$1.invoke(MaterialTheme.kt:80) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228) at androidx.compose.material3.MaterialThemeKt.MaterialTheme(MaterialTheme.kt:73) at com.rcudev.simplemediaplayer.common.ui.theme.ThemeKt.SimpleMediaPlayerTheme(Theme.kt:63) at com.rcudev.simplemediaplayer.common.ui.theme.ThemeKt$SimpleMediaPlayerTheme$2.invoke(Unknown Source:17) at com.rcudev.simplemediaplayer.common.ui.theme.ThemeKt$SimpleMediaPlayerTheme$2.invoke(Unknown Source:10) at androidx.compose.runtime.RecomposeScopeImpl.compose(RecomposeScopeImpl.kt:162) at androidx.compose.runtime.ComposerImpl.recomposeToGroupEnd(Composer.kt:2465) at androidx.compose.runtime.ComposerImpl.skipToGroupEnd(Composer.kt:2756) at androidx.compose.ui.platform.AbstractComposeView$ensureCompositionCreated$1.invoke(ComposeView.android.kt:252) at androidx.compose.ui.platform.AbstractComposeView$ensureCompositionCreated$1.invoke(ComposeView.android.kt:251) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) 2023-04-22 19:56:24.204 1453-1453 MessageQueue com.rcudev.simplemediaplayer W at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228) at androidx.compose.ui.platform.CompositionLocalsKt.ProvideCommonCompositionLocals(CompositionLocals.kt:194) at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$3.invoke(AndroidCompositionLocals.android.kt:123) at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$3.invoke(AndroidCompositionLocals.android.kt:122) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228) at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt.ProvideAndroidCompositionLocals(AndroidCompositionLocals.android.kt:114) at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$4.invoke(Unknown Source:12) at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$4.invoke(Unknown Source:10) at androidx.compose.runtime.RecomposeScopeImpl.compose(RecomposeScopeImpl.kt:162) at androidx.compose.runtime.ComposerImpl.recomposeToGroupEnd(Composer.kt:2465) at androidx.compose.runtime.ComposerImpl.skipCurrentGroup(Composer.kt:2733) at androidx.compose.runtime.ComposerImpl$doCompose$2$5.invoke(Composer.kt:3364) at androidx.compose.runtime.ComposerImpl$doCompose$2$5.invoke(Composer.kt:3342) at androidx.compose.runtime.SnapshotStateKt__DerivedStateKt.observeDerivedStateRecalculations(DerivedState.kt:341) at androidx.compose.runtime.SnapshotStateKt.observeDerivedStateRecalculations(Unknown Source:1) at androidx.compose.runtime.ComposerImpl.doCompose(Composer.kt:3342) at androidx.compose.runtime.ComposerImpl.recompose$runtime_release(Composer.kt:3307) at androidx.compose.runtime.CompositionImpl.recompose(Composition.kt:772) at androidx.compose.runtime.Recomposer.performRecompose(Recomposer.kt:1047) at androidx.compose.runtime.Recomposer.access$performRecompose(Recomposer.kt:124) at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:541) at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:510) at androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1.doFrame(AndroidUiFrameClock.android.kt:34) at androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(AndroidUiDispatcher.android.kt:109) at androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(AndroidUiDispatcher.android.kt:41) at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.doFrame(AndroidUiDispatcher.android.kt:69) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1449) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1459) at android.view.Choreographer.doCallbacks(Choreographer.java:1089) at android.view.Choreographer.doFrame(Choreographer.java:998) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1431) at android.os.Handler.handleCallback(Handler.java:942) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:210) at android.os.Looper.loop(Looper.java:299) at android.app.ActivityThread.main(ActivityThread.java:8252) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:559) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:954)

RcuDev commented 1 year ago

@MilicTG thanks for the feedback. I updated a fix on main brach. This error is because wrong manage of di with hilt and Singleton player.

If you confirm me that the error is fixed, I close this issue.

MilicTG commented 1 year ago

Yep that fixed the issue but now the notification is gone and when you kill the app music continues to play.

maxrave-dev commented 1 year ago

But Notification don't show and when close app music still play

RcuDev commented 1 year ago

Thanks for the feedback. Today I fix it if I can :)

Undefined-maker commented 1 year ago

Yes, now the notification is gone. Wish you success!

maxrave-dev commented 1 year ago

I fix this problem when i clear NotificationManager and SessionMedia Provide in DI Module, and create an instance of them inside SimpleMediaService `package com.maxrave.simpmusic.service

import android.annotation.SuppressLint import android.content.Intent import android.util.Log import androidx.media.app.NotificationCompat import androidx.media3.common.Player import androidx.media3.common.util.UnstableApi import androidx.media3.exoplayer.ExoPlayer import androidx.media3.session.MediaNotification import androidx.media3.session.MediaSession import androidx.media3.session.MediaSessionService import androidx.media3.ui.PlayerNotificationManager import com.google.android.gms.common.internal.Constants import com.maxrave.simpmusic.R import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import javax.inject.Inject import javax.inject.Named

@AndroidEntryPoint class SimpleMediaService : MediaSessionService() {

@Inject
@Named("playerInstance")
lateinit var player: ExoPlayer

lateinit var mediaSession: MediaSession

lateinit var notificationManager: SimpleMediaNotificationManager

@UnstableApi
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
    notificationManager.startNotificationService(
        mediaSessionService = this,
        mediaSession = mediaSession
    )
    return super.onStartCommand(intent, flags, startId)
}

override fun onCreate() {
    super.onCreate()
    mediaSession = MediaSession.Builder(this, player).build()

    notificationManager = SimpleMediaNotificationManager(
        context = this,
        player = player
    )
}

override fun onDestroy() {
    super.onDestroy()
        mediaSession.release()
        player.release()
}

override fun onGetSession(controllerInfo: MediaSession.ControllerInfo): MediaSession =
    mediaSession

@UnstableApi
override fun onUpdateNotification(session: MediaSession, startInForegroundRequired: Boolean) {
    super.onUpdateNotification(session, startInForegroundRequired)
}

override fun onTaskRemoved(rootIntent: Intent?) {
    super.onTaskRemoved(rootIntent)
    player.stop()
}

}

And in Module import android.app.Application import android.content.Context import android.util.Log import androidx.media3.common.AudioAttributes import androidx.media3.common.C import androidx.media3.common.util.UnstableApi import androidx.media3.exoplayer.DefaultLoadControl import androidx.media3.exoplayer.DefaultRenderersFactory import androidx.media3.exoplayer.ExoPlayer import androidx.media3.exoplayer.trackselection.DefaultTrackSelector import androidx.media3.exoplayer.upstream.DefaultAllocator import androidx.media3.session.MediaSession import com.maxrave.simpmusic.service.SimpleMediaNotificationManager import com.maxrave.simpmusic.service.SimpleMediaServiceHandler import dagger.Module import dagger.Provides import dagger.Reusable import dagger.hilt.InstallIn import dagger.hilt.android.components.ServiceComponent import dagger.hilt.android.components.ViewModelComponent import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.scopes.ServiceScoped import dagger.hilt.android.scopes.ViewModelScoped import dagger.hilt.components.SingletonComponent import dagger.hilt.migration.DisableInstallInCheck import javax.inject.Named import javax.inject.Singleton

@Module @InstallIn(SingletonComponent::class) object MusicServiceModule { private var playerCounter = 0 // Biến đếm

@Provides
@Singleton

// @ServiceScoped // @Provides fun provideAudioAttributes(): AudioAttributes = AudioAttributes.Builder() .setContentType(C.AUDIO_CONTENT_TYPE_MUSIC) .setUsage(C.USAGE_MEDIA) .build() // @UnstableApi // @Provides // @Singleton // fun provideLoadControl(): DefaultLoadControl = DefaultLoadControl.Builder().setAllocator( // DefaultAllocator(true, 16) // ) // .build() @UnstableApi @Provides @Singleton // @ServiceScoped // @Provides fun provideRendererFactory(application: Application): DefaultRenderersFactory = DefaultRenderersFactory(application)

@UnstableApi
@Provides
@Singleton

// @ServiceScoped // @Provides @Named("playerInstance") fun providePlayer( application: Application, audioAttributes: AudioAttributes, defaultRenderersFactory: DefaultRenderersFactory // loadControl: DefaultLoadControl ): ExoPlayer { playerCounter++ Log.d("MusicServiceModule", "providePlayer: NEW PLAYER ${playerCounter}") val player = ExoPlayer.Builder(application, defaultRenderersFactory) .setHandleAudioBecomingNoisy(true) .setTrackSelector(DefaultTrackSelector(application)) .setWakeMode(C.WAKE_MODE_LOCAL) // .setLoadControl(loadControl) .build() player.setAudioAttributes(audioAttributes, true) return player } @UnstableApi @Provides @Singleton // @ServiceScoped // @Provides fun provideServiceHandler( @Named("playerInstance") player: ExoPlayer ): SimpleMediaServiceHandler = SimpleMediaServiceHandler( player = player ) }`

MilicTG commented 1 year ago

@maxrave-dev This fixes the problem with notifications and background playing but sometimes there is again that bug sending message to a Handler on a dead thread.

RcuDev commented 1 year ago

I all and thanks for the feedback. I just update a fix.

Apparently everything was fine, but the problem was doing player.release() when the service was destroyed.

I have uploaded some changes in it to reset the player. It's more of a workaround, I'll keep checking the issue.

MilicTG commented 1 year ago

This seems to fix the issue, thanks.

mustafabayram commented 10 months ago

hey , first of all thanks for you gave us a guidance usage of jetpack media lib. but I think this problem still continue, and actually I think this cause a leak because you don' t release the player. And the player is still awake. When you release the player this cause that problem. And you also don't remove the listener from player which you have added inside of SimpleMediaServiceHandler init function. Do you have any idea ? I couldn't figure it out.