这是indexloc提供的服务,不要输入任何密码
Skip to content

Bug Report: AssertionError in WebRtcAudioRecord on Android #700

@himaaaaanshu

Description

@himaaaaanshu

Describe the bug
Fatal java.lang.AssertionError occurs in WebRtcAudioRecord.assertTrue() when attempting to enable microphone through LocalParticipant.setMicrophoneEnabled(true). The crash happens during audio recording prewarm phase in the WebRTC native layer, despite all required permissions being properly granted.

Expected behavior
Microphone should be enabled successfully without throwing an assertion error. The setMicrophoneEnabled(true) call should complete normally and allow audio recording to proceed.

Stack trace

Fatal Exception: java.lang.AssertionError: Expected condition to be true
       at livekit.org.webrtc.audio.WebRtcAudioRecord.assertTrue(WebRtcAudioRecord.java:739)
       at livekit.org.webrtc.audio.WebRtcAudioRecord.startRecordingImpl(WebRtcAudioRecord.java:582)
       at livekit.org.webrtc.audio.WebRtcAudioRecord.prewarmRecordingIfNeeded(WebRtcAudioRecord.java:535)
       at livekit.org.webrtc.audio.JavaAudioDeviceModule.prewarmRecording(JavaAudioDeviceModule.java:462)
       at io.livekit.android.audio.JavaAudioRecordPrewarmer.prewarm(AudioRecordPrewarmer.kt:47)
       at io.livekit.android.room.track.LocalAudioTrack.prewarm(LocalAudioTrack.kt:91)
       at io.livekit.android.room.participant.LocalParticipant.setTrackEnabled(LocalParticipant.kt:368)
       at io.livekit.android.room.participant.LocalParticipant.setTrackEnabled$default(LocalParticipant.kt:334)
       at io.livekit.android.room.participant.LocalParticipant.setMicrophoneEnabled(LocalParticipant.kt:306)
       at io.livekit.android.compose.local.RoomLocalKt$rememberLiveKitRoom$audioOnce$1$ret$1.invokeSuspend(RoomLocal.kt:162)
       at io.livekit.android.compose.local.RoomLocalKt$rememberLiveKitRoom$audioOnce$1$ret$1.invoke(:13)
       at io.livekit.android.compose.local.RoomLocalKt$rememberLiveKitRoom$audioOnce$1$ret$1.invoke(:8)
       at io.livekit.android.compose.local.RoomLocalKt$HandleRoomState$1$1$2.invokeSuspend(RoomLocal.kt:61)
       at io.livekit.android.compose.local.RoomLocalKt$HandleRoomState$1$1$2.invoke(:8)
       at io.livekit.android.compose.local.RoomLocalKt$HandleRoomState$1$1$2.invoke(:4)
       at kotlinx.coroutines.flow.FlowKt__MergeKt$mapLatest$1.invokeSuspend(Merge.kt:213)
       at kotlinx.coroutines.flow.FlowKt__MergeKt$mapLatest$1.invoke(:13)
       at kotlinx.coroutines.flow.FlowKt__MergeKt$mapLatest$1.invoke(:4)
       at kotlinx.coroutines.flow.internal.ChannelFlowTransformLatest$flowCollect$3$1$2.invokeSuspend(Merge.kt:30)
       at kotlinx.coroutines.flow.internal.ChannelFlowTransformLatest$flowCollect$3$1$2.invoke(:8)
       at kotlinx.coroutines.flow.internal.ChannelFlowTransformLatest$flowCollect$3$1$2.invoke(:4)
       at kotlinx.coroutines.intrinsics.UndispatchedKt.startCoroutineUndispatched(Undispatched.kt:20)
       at kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:360)
       at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:134)
       at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch(Builders.common.kt:52)
       at kotlinx.coroutines.BuildersKt.launch(:1)
       at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch$default(Builders.common.kt:43)
       at kotlinx.coroutines.BuildersKt.launch$default(:1)
       at kotlinx.coroutines.flow.internal.ChannelFlowTransformLatest$flowCollect$3$1.emit(Merge.kt:29)
       at kotlinx.coroutines.flow.StateFlowImpl.collect(StateFlow.kt:401)
       at kotlinx.coroutines.flow.StateFlowImpl$collect$1.invokeSuspend(:15)
       at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
       at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100)
       at androidx.compose.ui.platform.AndroidUiDispatcher.performTrampolineDispatch(AndroidUiDispatcher.android.kt:79)
       at androidx.compose.ui.platform.AndroidUiDispatcher.access$performTrampolineDispatch(AndroidUiDispatcher.android.kt:41)
       at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.run(AndroidUiDispatcher.android.kt:57)
       at android.os.Handler.handleCallback(Handler.java:790)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:164)
       at android.app.ActivityThread.main(ActivityThread.java:6494)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

Device Info:

  • OS: Android 8.1.0 (API 27)
  • LiveKit SDK version: 2.17.0
  • LiveKit Compose Components version: 1.3.1
  • Device Specs:
    • RAM Free: 1.08 GB
    • Disk Free: 5.46 GB
    • Orientation: Portrait
    • Rooted: No

Additional context

  • All permissions are properly granted: RECORD_AUDIO, MODIFY_AUDIO_SETTINGS, INTERNET, ACCESS_NETWORK_STATE
  • This is NOT a permissions issue - the crash occurs at the WebRTC native layer despite having all required permissions
  • Dependencies used:
    livekit-lib = { group = "io.livekit", name = "livekit-android", version = "2.17.0" }
    livekit-components = { group = "io.livekit", name = "livekit-android-compose-components", version = "1.3.1" }
  • Potential causes: Compatibility issues with older Android API level (27)
  • Impact: Application crashes when attempting to enable microphone functionality

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions