Android Calls SDK: no audio and no video on an incoming video DirectCall when CAMERA / RECORD_AUDIO are granted after onRinging

[Problem/Question]
If the Android app doesn’t have CAMERA and RECORD_AUDIO when an incoming video DirectCall starts ringing, it requests them in onRinging. The user grants both and we accept() with audio and video enabled. The call connects, but the caller (our web app) gets no audio and no video from the Android user. If the permissions were granted before the call started ringing, everything works.

From reading the SDK: the PeerConnection constructor runs when the DirectCall is created (ringing) and builds the whole media pipeline once: JavaAudioDeviceModule, audio source/track, video source/track. Nothing rebuilds it after a later permission grant. startVideo() and hold()/unhold() (which goes through resumeVideoCapturer()) only replace the capturer inside the existing pipeline, so they don’t recover audio or video. We tried hold()/unhold() on a device; no change.

Same symptom, unanswered: 7883 and 8958

Could you either rebuild the media pipeline on accept(), expose an API to do that.


[SDK Version]
Sendbird Calls Android SDK 1.12.5 (com.sendbird.sdk:sendbird-calls:1.12.5). Caller: Sendbird Calls JavaScript SDK in our web app.

[Reproduction Steps]

  1. Revoke CAMERA and RECORD_AUDIO for the Android app (Settings > Apps > Permissions).

  2. Place a 1:1 video DirectCall to the Android user.

  3. In onRinging, show the incoming-call screen. On “Accept”, request the permissions:

    requestPermissions(arrayOf(Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA), RC)

  4. Grant both. In onRequestPermissionsResult, accept:

    val options = CallOptions()
    .setAudioEnabled(true)
    .setVideoEnabled(true)
    .setFrontCameraAsDefault(true)
    call.accept(AcceptParams().setCallOptions(options))

  5. The call reaches onConnected. The caller sees a black video and hears nothing from the Android side.

  6. Optional: call startVideo(), or hold() then unhold(true). No change.

Control: grant both permissions before step 2 and repeat. Audio and video work.

[Frequency]
100% reproducible whenever either permission is missing at the moment the call starts ringing.

[Current impact]
Users who haven’t granted camera and microphone before their first call can’t be seen or heard by their other side, even after granting the permissions on the call screen. Our workaround: ask for both permissions up front, before any call can arrive. If a call still rings without them, we answer voice-only (no camera) or decline and ask the caller to call back (no microphone). That means a lost or degraded first call for those users.

Hello Aleksandr_Ivanov,
Welcome to the Sendbird Community!

Thank you for the detailed write-up and clear repro steps, and for pinpointing where in the flow it happens.

What you’re seeing is a limitation in how the Calls SDK handles permissions on Android. If CAMERA or RECORD_AUDIO is granted after an incoming call has started ringing, the call can connect without audio or video, and there is currently no supported way to restore media on that call. Our documentation asks for these permissions to be granted when the app first launches.

Your current approach is the one we recommend: request both permissions up front (at login or first launch), and for a call that arrives without them, answer voice-only or decline.

I’ve shared your request for a way to rebuild media after a late permission grant with our Calls Engineering Team. I can’t commit to a timeline, but I’ll update this thread if there are any changes.

Thank you.