Skip to content

Android video call disconnects every 30-60s seconds #1124

@KestasVenslauskas

Description

@KestasVenslauskas

Sometimes the video call just keeps on disconnecting on android. Not sure what causes it yet.

I was not able to reproduce it on emulator yet.
But I have this issue constantly on my Pixel 8a phone.

Additional updates:

  • 2025-12-05 Issue only happens on physical device - Pixel 8a
  • 2025-12-08 Issue only persists when I'm on my home wifi. Switching back to mobile network removes this issue.
  • 2025-12-08 Switching stream from WebRTC to HLS does not help

flutter logs output in the timeframe from video freezing to successful reconnection:

I/flutter (21313): 2025-12-05 15:48:47.047086 ⚠️ (W/SV:CallSession-2): [negotiate] #setPublisher; failed: Result.Failure{error: VideoErrorWithCause{message: participant not found, exception: SfuError{code: participantNotFound, message: participant not found, shouldRetry: false, reconnectStrategy: unspecified}, stackTrace: #0      SfuClient._executeWithRetry (package:stream_video/src/sfu/sfu_client.dart:78:49)
I/flutter (21313): <asynchronous suspension>
I/flutter (21313): #1      SfuClient.setPublisher (package:stream_video/src/sfu/sfu_client.dart:142:22)
I/flutter (21313): <asynchronous suspension>
I/flutter (21313): #2      CallSession._onRenegotiationNeeded.<anonymous closure> (package:stream_video/src/call/session/call_session.dart:931:25)
I/flutter (21313): <asynchronous suspension>
I/flutter (21313): #3      BasicLock.synchronized (package:synchronized/src/basic_lock.dart:38:16)
I/flutter (21313): <asynchronous suspension>
I/flutter (21313): #4      CallSession._onRenegotiationNeeded (package:stream_video/src/call/session/call_session.dart:913:5)
I/flutter (21313): <asynchronous suspension>
I/flutter (21313): }}
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceCandidate
W/FlutterWebRTCPlugin(21313): FlutterRTCVideoRenderer.setVideoTrack, set video track to null
W/FlutterWebRTCPlugin(21313): FlutterRTCVideoRenderer.setVideoTrack, set video track to null
D/FlutterWebRTCPlugin(21313): onConnectionChangeCLOSED
D/FlutterWebRTCPlugin(21313): onConnectionChangeCLOSED
I/flutter (21313): 2025-12-05 15:48:48.365337 ⚠️ (W/SV:RtcManager): [getPublisherTrackByType] track not found: video
I/FlutterWebRTCPlugin(21313): getUserMedia(video): ConstraintsMap{mMap={frameRate=30, mirror=defaultMode, facingMode=user, width=1280, height=720}}
D/FlutterWebRTCPlugin(21313): Creating video capturer using Camera2 API.
D/FlutterWebRTCPlugin(21313): Create front camera 1 succeeded
D/FlutterWebRTCPlugin(21313): CameraEventsHandler.waitForCameraOpen
D/FlutterWebRTCPlugin(21313): CameraEventsHandler.onCameraOpening: cameraName=1
D/FlutterWebRTCPlugin(21313): CameraEventsHandler.onCameraDisconnected
D/FlutterWebRTCPlugin(21313): CameraEventsHandler.onFirstFrameAvailable
D/FlutterWebRTCPlugin(21313): CameraEventsHandler.onFirstFrameAvailable
D/FlutterWebRTCPlugin(21313): Target: 1280x720@30, Actual: 1280x720@30
D/FlutterWebRTCPlugin(21313): MediaStream id: a2354503-e2b1-4e80-a9c2-ae291d097a50
I/flutter (21313): 2025-12-05 15:48:48.626216 ⚠️ (W/SV:RtcManager): [getPublisherTrackByType] track not found: audio
I/FlutterWebRTCPlugin(21313): getUserMedia(audio): mandatory: [], optional: [echoCancellation: true, googDAEchoCancellation: true, googEchoCancellation: true, googEchoCancellation2: true, noiseSuppression: true, googNoiseSuppression: true, googNoiseSuppression2: true, googAutoGainControl: true, googHighpassFilter: false, googTypingNoiseDetection: true, DtlsSrtpKeyAgreement: true]
D/FlutterWebRTCPlugin(21313): MediaStream id: c309c537-11fb-4b2c-bee1-6094448d76a8
D/FlutterWebRTCPlugin(21313): onIceGatheringChangeGATHERING
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onAddTrack
D/FlutterWebRTCPlugin(21313): onAddTrack
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceCandidate
W/FlutterWebRTCPlugin(21313): FlutterRTCVideoRenderer.setVideoTrack, set video track to 8a2287d6-2feb-40c8-8d43-ee888b361f91
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceGatheringChangeGATHERING
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onIceCandidate
D/FlutterWebRTCPlugin(21313): onConnectionChangeDISCONNECTED
D/FlutterWebRTCPlugin(21313): onConnectionChangeDISCONNECTED
I/flutter (21313): 2025-12-05 15:48:53.006861 ⚠️ (W/SV:Call-2): [_reconnect] skipping reconnect (join in progress)
D/FlutterWebRTCPlugin(21313): onConnectionChangeCONNECTING
D/FlutterWebRTCPlugin(21313): onConnectionChangeCONNECTING
D/FlutterWebRTCPlugin(21313): onSelectedCandidatePairChanged
D/FlutterWebRTCPlugin(21313): onIceGatheringChangeCOMPLETE
D/FlutterWebRTCPlugin(21313): onSelectedCandidatePairChanged
D/FlutterWebRTCPlugin(21313): onIceGatheringChangeCOMPLETE
D/FlutterWebRTCPlugin(21313): onConnectionChangeCONNECTED
D/FlutterWebRTCPlugin(21313): onConnectionChangeCONNECTED
W/FlutterWebRTCPlugin(21313): FlutterRTCVideoRenderer.setVideoTrack, set video track to 4765f010-08b6-44bb-82b2-6693b884fe4a
I/flutter (21313): 2025-12-05 15:48:59.755243 ⚠️ (W/SV:Sfu-WS-3): [disconnect] rejected (already disconnected)
D/FlutterWebRTCPlugin(21313): CameraEventsHandler.waitForCameraClosed
D/FlutterWebRTCPlugin(21313): removeTrack(): sender is null
I/flutter (21313): 2025-12-05 15:48:59.794122 ⚠️ (W/SV:RtcManager): [unpublishTrack] removeTrack failed: Unable to RTCPeerConnection::removeTrack: removeTrack(): sender is null
D/FlutterWebRTCPlugin(21313): onConnectionChangeCLOSED
D/FlutterWebRTCPlugin(21313): onConnectionChangeCLOSED

So I ran project on my phone and got more logs on the same issue:

D/AidlBufferPool(29497): bufferpool2 0xb400006de19e0a58 : 5(4608000 size) total buffers - 4(3686400 size) used buffers - 724/729 (recycle/alloc) - 9/1450 (fetch/transfer)
D/MediaConstraintsUtils(29497): mandatory constraints are not a map
D/MediaConstraintsUtils(29497): optional constraints are not an array
D/FlutterWebRTCPlugin(29497): onIceGatheringChangeGATHERING
11
D/FlutterWebRTCPlugin(29497): onIceCandidate
I/flutter (29497): 2025-12-05 16:02:02.716749 ⚠️ (W/SV:CallSession-4): [negotiate] #setPublisher; failed: Result.Failure{error: VideoErrorWithCause{message: participant not found, exception: SfuError{code: participantNotFound, message: participant not found, shouldRetry: false, reconnectStrategy: unspecified}, stackTrace: #0      SfuClient._executeWithRetry (package:stream_video/src/sfu/sfu_client.dart:78:49)
sfu_client.dart:78
I/flutter (29497): <asynchronous suspension>
I/flutter (29497): #1      SfuClient.setPublisher (package:stream_video/src/sfu/sfu_client.dart:142:22)
sfu_client.dart:142
I/flutter (29497): <asynchronous suspension>
I/flutter (29497): #2      CallSession._onRenegotiationNeeded.<anonymous closure> (package:stream_video/src/call/session/call_session.dart:931:25)
call_session.dart:931
I/flutter (29497): <asynchronous suspension>
I/flutter (29497): #3      BasicLock.synchronized (package:synchronized/src/basic_lock.dart:38:16)
basic_lock.dart:38
I/flutter (29497): <asynchronous suspension>
I/flutter (29497): #4      CallSession._onRenegotiationNeeded (package:stream_video/src/call/session/call_session.dart:913:5)
call_session.dart:913
I/flutter (29497): <asynchronous suspension>
I/flutter (29497): }}
E/CameraCaptureSession(29497): Session 0: Exception while stopping repeating: 
E/CameraCaptureSession(29497): android.hardware.camera2.CameraAccessException: CAMERA_ERROR (3): cancelRequest:804: Camera 1: Error clearing streaming request: Function not implemented (-38)
E/CameraCaptureSession(29497): 	at android.hardware.camera2.utils.ExceptionUtils.throwAsPublicException(ExceptionUtils.java:75)
E/CameraCaptureSession(29497): 	at android.hardware.camera2.impl.ICameraDeviceUserWrapper.cancelRequest(ICameraDeviceUserWrapper.java:105)
E/CameraCaptureSession(29497): 	at android.hardware.camera2.impl.CameraDeviceImpl.stopRepeating(CameraDeviceImpl.java:1696)
E/CameraCaptureSession(29497): 	at android.hardware.camera2.impl.CameraCaptureSessionImpl.close(CameraCaptureSessionImpl.java:603)
E/CameraCaptureSession(29497): 	at android.hardware.camera2.impl.CameraCaptureSessionImpl$2.onDisconnected(CameraCaptureSessionImpl.java:829)
E/CameraCaptureSession(29497): 	at android.hardware.camera2.impl.CameraDeviceImpl$9.run(CameraDeviceImpl.java:331)
E/CameraCaptureSession(29497): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1156)
E/CameraCaptureSession(29497): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:651)
E/CameraCaptureSession(29497): 	at java.lang.Thread.run(Thread.java:1119)
E/CameraCaptureSession(29497): Caused by: android.os.ServiceSpecificException: cancelRequest:804: Camera 1: Error clearing streaming request: Function not implemented (-38) (code 10)
E/CameraCaptureSession(29497): 	at android.os.Parcel.createExceptionOrNull(Parcel.java:3369)
E/CameraCaptureSession(29497): 	at android.os.Parcel.createException(Parcel.java:3339)
E/CameraCaptureSession(29497): 	at android.os.Parcel.readException(Parcel.java:3322)
E/CameraCaptureSession(29497): 	at android.os.Parcel.readException(Parcel.java:3264)
E/CameraCaptureSession(29497): 	at android.hardware.camera2.ICameraDeviceUser$Stub$Proxy.cancelRequest(ICameraDeviceUser.java:751)
E/CameraCaptureSession(29497): 	at android.hardware.camera2.impl.ICameraDeviceUserWrapper.cancelRequest(ICameraDeviceUserWrapper.java:103)
E/CameraCaptureSession(29497): 	... 7 more
D/Camera2PresenceSrc(29497): [FetchData] Refreshed camera list: CameraIdentifier{cameraIds=0}, CameraIdentifier{cameraIds=1}
D/FlutterWebRTCPlugin(29497): CameraEventsHandler.onCameraDisconnected
D/Camera2PresenceSrc(29497): [FetchData] Refreshed camera list: CameraIdentifier{cameraIds=0}, CameraIdentifier{cameraIds=1}
D/FlutterWebRTCPlugin(29497): CameraEventsHandler.onFirstFrameAvailable
W/main_texture_ca(29497): type=1400 audit(0.0:62233): avc:  denied  { getattr } for  name="/" dev="dmabuf" ino=1 scontext=u:r:untrusted_app:s0:c71,c258,c512,c768 tcontext=u:object_r:unlabeled:s0 tclass=filesystem permissive=0 app=health.upcoming.client.dev
D/FlutterWebRTCPlugin(29497): CameraEventsHandler.onFirstFrameAvailable
D/FlutterWebRTCPlugin(29497): Target: 1280x720@30, Actual: 1280x720@30
D/FlutterWebRTCPlugin(29497): MediaStream id: 6d467760-6661-44cc-81eb-61ecb7deaf9e
I/flutter (29497): 2025-12-05 16:02:04.296140 ⚠️ (W/SV:RtcManager): [getPublisherTrackByType] track not found: audio
D/MediaConstraintsUtils(29497): mandatory constraints are not a map
D/MediaConstraintsUtils(29497): optional constraints are not an array
D/MediaConstraintsUtils(29497): mandatory constraints are not a map
I/FlutterWebRTCPlugin(29497): getUserMedia(audio): mandatory: [], optional: [echoCancellation: true, googDAEchoCancellation: true, googEchoCancellation: true, googEchoCancellation2: true, noiseSuppression: true, googNoiseSuppression: true, googNoiseSuppression2: true, googAutoGainControl: true, googHighpassFilter: false, googTypingNoiseDetection: true, DtlsSrtpKeyAgreement: true]
D/FlutterWebRTCPlugin(29497): MediaStream id: 1427b437-af78-49f6-8a6d-a493c78dc644
W/main_texture_ca(29497): type=1400 audit(0.0:62234): avc:  denied  { getattr } for  name="/" dev="dmabuf" ino=1 scontext=u:r:untrusted_app:s0:c71,c258,c512,c768 tcontext=u:object_r:unlabeled:s0 tclass=filesystem permissive=0 app=health.upcoming.client.dev
D/FlutterWebRTCPlugin(29497): onIceGatheringChangeGATHERING
4
D/FlutterWebRTCPlugin(29497): onIceCandidate
W/main_texture_ca(29497): type=1400 audit(0.0:62235): avc:  denied  { getattr } for  name="/" dev="dmabuf" ino=1 scontext=u:r:untrusted_app:s0:c71,c258,c512,c768 tcontext=u:object_r:unlabeled:s0 tclass=filesystem permissive=0 app=health.upcoming.client.dev
2
D/FlutterWebRTCPlugin(29497): onIceCandidate
2
D/FlutterWebRTCPlugin(29497): onAddTrack
6
D/FlutterWebRTCPlugin(29497): onIceCandidate
D/MediaConstraintsUtils(29497): mandatory constraints are not a map
D/MediaConstraintsUtils(29497): optional constraints are not an array
2
D/FlutterWebRTCPlugin(29497): onIceCandidate
W/FlutterWebRTCPlugin(29497): FlutterRTCVideoRenderer.setVideoTrack, set video track to 8a2287d6-2feb-40c8-8d43-ee888b361f91
D/FlutterWebRTCPlugin(29497): onIceGatheringChangeGATHERING
5
D/FlutterWebRTCPlugin(29497): onIceCandidate
D/MediaConstraintsUtils(29497): mandatory constraints are not a map
D/MediaConstraintsUtils(29497): optional constraints are not an array
D/FlutterWebRTCPlugin(29497): onIceCandidate
D/CCodec  (29497): allocate(c2.exynos.vp9.encoder)
D/CCodec  (29497): allocate(c2.exynos.vp9.encoder)
I/CCodec  (29497): setting up 'default' as default (vendor) store
W/ming.client.dev(29497): AIBinder_linkToDeath is being called with a non-null cookie and no onUnlink callback set. This might not be intended. AIBinder_DeathRecipient_setOnUnlinked should be called first.
I/CCodec  (29497): Created component [c2.exynos.vp9.encoder] for [c2.exynos.vp9.encoder]
D/CCodecConfig(29497): read media type: video/x-vnd.on2.vp9
D/ReflectedParamUpdater(29497): extent() != 1 for single value type: output.subscribed-indices.values
D/ReflectedParamUpdater(29497): extent() != 1 for single value type: input.buffers.allocator-ids.values
D/ReflectedParamUpdater(29497): extent() != 1 for single value type: output.buffers.allocator-ids.values
D/ReflectedParamUpdater(29497): extent() != 1 for single value type: output.buffers.pool-ids.values
D/ReflectedParamUpdater(29497): ignored struct field coding.qp.values
D/CCodecConfig(29497): ignoring local param raw.color (0xc2001809) as it is already supported
I/CCodecConfig(29497): query failed after returning 21 values (BAD_INDEX)
D/CCodecConfig(29497): c2 config diff is Dict {
D/CCodecConfig(29497):   c2::u32 algo.bitrate-mode.value = 3
D/CCodecConfig(29497):   c2::u32 algo.encoding-quality-level.value = 0
D/CCodecConfig(29497):   c2::i32 algo.priority.value = 0
D/CCodecConfig(29497):   c2::float algo.rate.value = 0
D/CCodecConfig(29497):   c2::i32 coded.average-qp.value = 0
D/CCodecConfig(29497):   c2::u32 coded.bitrate-mode.value = 1
D/CCodecConfig(29497):   c2::u32 coded.bitrate.value = 64000
D/CCodecConfig(29497):   c2::float coded.frame-rate.value = 15
D/CCodecConfig(29497):   c2::u32 coded.hdr-format.value = 0
D/CCodecConfig(29497):   c2::u32 coded.picture-type.value = 0
D/CCodecConfig(29497):   c2::u32 coded.pl.level = 28674
D/CCodecConfig(29497):   c2::u32 coded.pl.profile = 28672
D/CCodecConfig(29497):   c2::u32 coding.intra-refresh.mode = 0
D/CCodecConfig(29497):   c2::float coding.intra-refresh.period = 0
D/CCodecConfig(29497):   c2::u32 coding.request-sync-frame.value = 0
D/CCodecConfig(29497):   c2::i64 coding.sync-frame-interval.value = 1000000
D/CCodecConfig(29497):   Buffer coding.temporal-layering = {
D/CCodecConfig(29497):     00000000:  10 00 00 00 07 20 01 52  00 00 00 00 00 00 00 00  ..... .R........
D/CCodecConfig(29497):   }
D/CCodecConfig(29497):   Buffer input.hdr-dynamic-info.data = {
D/CCodecConfig(29497):   }
D/CCodecConfig(29497):   c2::u32 input.hdr-dynamic-info.type = 1
D/CCodecConfig(29497):   string input.media-type.value = "video/raw"
D/CCodecConfig(29497):   Buffer output.hdr-dynamic-info.data = {
D/CCodecConfig(29497):   }
D/CCodecConfig(29497):   c2::u32 output.hdr-dynamic-info.type = 1
D/CCodecConfig(29497):   string output.med
I/MediaCodec(29497): media_quality service unavailable, skipping updatePictureProfile
D/VQApply (29497): minquality: applies only to VBR encoding
D/MediaCodec(29497): shapeMediaFormat: deltas(0): AMessage(what = 0x00000000) = {
D/MediaCodec(29497):   }
D/CCodec  (29497): [c2.exynos.vp9.encoder] buffers are bound to CCodec for this session
D/CCodecConfig(29497): no c2 equivalents for color-format
D/CCodecConfig(29497): no c2 equivalents for flags
D/CCodecConfig(29497): no c2 equivalents for encoder
D/CCodecConfig(29497): c2 config diff is   c2::u32 algo.bitrate-mode.value = 1
D/CCodecConfig(29497):   c2::u32 coded.bitrate.value = 300000
D/CCodecConfig(29497):   c2::float coded.frame-rate.value = 30
D/CCodecConfig(29497):   c2::i64 coding.sync-frame-interval.value = 3600000000
D/CCodecConfig(29497):   c2::u32 raw.size.height = 1280
D/CCodecConfig(29497):   c2::u32 raw.size.width = 720
D/CCodec  (29497): encoding statistics level = 0


...


2
D/FlutterWebRTCPlugin(29497): onConnectionChangeDISCONNECTED
I/flutter (29497): 2025-12-05 16:02:08.765712 ⚠️ (W/SV:Call-1): [_reconnect] skipping reconnect (join in progress)
D/AidlBufferPool(29497): bufferpool2 0xb400006de19e0a58 : 4(3686400 size) total buffers - 4(3686400 size) used buffers - 782/787 (recycle/alloc) - 10/1564 (fetch/transfer)
D/AidlBufferPoolAcc(29497): evictor expired: 1, evicted: 1
D/AidlBufferPoolAcc(29497): evictor expired: 4, evicted: 0
D/AidlBufferPool(29497): bufferpool2 0xb400006de1b66288 : 0(0 size) total buffers - 0(0 size) used buffers - 0/0 (recycle/alloc) - 0/0 (fetch/transfer)
D/AidlBufferPoolAcc(29497): evictor expired: 1, evicted: 1
2
D/FlutterWebRTCPlugin(29497): onConnectionChangeCONNECTING
D/FlutterWebRTCPlugin(29497): onSelectedCandidatePairChanged
D/FlutterWebRTCPlugin(29497): onIceGatheringChangeCOMPLETE
D/FlutterWebRTCPlugin(29497): onSelectedCandidatePairChanged
D/FlutterWebRTCPlugin(29497): onIceGatheringChangeCOMPLETE
2
D/FlutterWebRTCPlugin(29497): onConnectionChangeCONNECTED
D/AidlBufferPool(29497): Destruction - bufferpool2 0xb400006de1b66288 cached: 0/0M, 0/0% in use; allocs: 0, 0% recycled; transfers: 0, 0% unfetched

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions