livekit / client-sdk-android

LiveKit SDK for Android
https://docs.livekit.io
Apache License 2.0
160 stars 63 forks source link

MediaStreamTrack has been disposed on internet reconnection #442

Closed gerasanchit closed 3 days ago

gerasanchit commented 1 week ago

Getting its crashlog multiple times in crashanalytics

java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:558)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941)
Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941)
Caused by: java.util.concurrent.ExecutionException: java.lang.IllegalStateException: MediaStreamTrack has been disposed.
    at java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.util.concurrent.FutureTask.get(FutureTask.java:191)
    at io.livekit.android.webrtc.peerconnection.RTCThreadUtilsKt.executeBlockingOnRTCThread(RTCThreadUtils.kt:87)
    at io.livekit.android.room.track.VideoTrack.addRenderer(VideoTrack.kt:37)
    at io.livekit.android.room.track.RemoteVideoTrack.addRenderer(RemoteVideoTrack.kt:86)
    at io.livekit.android.compose.ui.VideoTrackViewKt.VideoTrackView$setupVideoIfNeeded(VideoTrackView.kt:116)
    at io.livekit.android.compose.ui.VideoTrackViewKt.access$VideoTrackView$setupVideoIfNeeded(VideoTrackView.kt:1)
    at io.livekit.android.compose.ui.VideoTrackViewKt$VideoTrackView$8.invoke(VideoTrackView.kt:159)
    at io.livekit.android.compose.ui.VideoTrackViewKt$VideoTrackView$8.invoke(VideoTrackView.kt:141)
    at androidx.compose.ui.viewinterop.ViewFactoryHolder$updateBlock$1.invoke(AndroidView.android.kt:367)
    at androidx.compose.ui.viewinterop.ViewFactoryHolder$updateBlock$1.invoke(AndroidView.android.kt:367)
    at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2299)
    at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:467)
    at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:230)
    at androidx.compose.ui.viewinterop.AndroidViewHolder$runUpdate$1.invoke(AndroidViewHolder.android.kt:178)
    at androidx.compose.ui.viewinterop.AndroidViewHolder$runUpdate$1.invoke(AndroidViewHolder.android.kt:176)
    at androidx.compose.ui.viewinterop.AndroidViewHolder$onCommitAffectingUpdate$1.invoke$lambda$0(AndroidViewHolder.android.kt:173)
    at androidx.compose.ui.viewinterop.AndroidViewHolder$onCommitAffectingUpdate$1.$r8$lambda$mF6AO8JmlFeJVsgs3SzniVwxyYo(Unknown Source:0)
    at androidx.compose.ui.viewinterop.AndroidViewHolder$onCommitAffectingUpdate$1$$ExternalSyntheticLambda0.run(D8$$SyntheticClass:0)
    at android.os.Handler.handleCallback(Handler.java:942)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loopOnce(Looper.java:201)
    at android.os.Looper.loop(Looper.java:288)
    at android.app.ActivityThread.main(ActivityThread.java:7927)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941)
Caused by: java.lang.IllegalStateException: MediaStreamTrack has been disposed.
    at livekit.org.webrtc.MediaStreamTrack.checkMediaStreamTrackExists(MediaStreamTrack.java:120)
    at livekit.org.webrtc.MediaStreamTrack.getNativeMediaStreamTrack(MediaStreamTrack.java:114)
    at livekit.org.webrtc.VideoTrack.addSink(VideoTrack.java:40)
    at io.livekit.android.room.track.VideoTrack$addRenderer$1.invoke(VideoTrack.kt:39)
    at io.livekit.android.room.track.VideoTrack$addRenderer$1.invoke(VideoTrack.kt:37)
    at io.livekit.android.webrtc.peerconnection.RTCThreadUtilsKt.executeBlockingOnRTCThread$lambda$1(RTCThreadUtils.kt:87)
    at io.livekit.android.webrtc.peerconnection.RTCThreadUtilsKt.$r8$lambda$ix-Gm1lHyeu28BSkgrvFK1qfBnU(Unknown Source:0)
    at io.livekit.android.webrtc.peerconnection.RTCThreadUtilsKt$$ExternalSyntheticLambda1.call(D8$$SyntheticClass:0)

Steps to reproduce the behavior:

  1. Used this implementation for initialising and passing track
    val trackRefs = rememberTracks()
    // Display the video tracks.
    // Audio tracks are automatically played.
    LazyColumn(modifier = Modifier.fillMaxSize()) {
           items(trackRefs.size) { index ->
                            VideoTrackView(
                                trackReference = trackRefs[index],
                                modifier = Modifier.fillParentMaxHeight(0.5f)
                            )
                        }
                    }
  2. Disconnect and reconnect internet
  3. Try this process atleast 10 times to replicate this issue Expected behavior App should not crash

Device Info: