Quick Reference for AI Agents & Developers
Available via: SDK | UI Kits
Overview
This section demonstrates how to start a call session in an Android application. Previously known as Direct Calling. Before you begin, we strongly recommend you read the calling setup guide.If you want to implement a complete calling experience with ringing functionality (incoming/outgoing call UI), follow the Ringing guide first. Once the call is accepted, return here to start the call session.
Generate Call Token
A call token is required for secure access to a call session. Each token is unique to a specific session and user combination, ensuring that only authorized users can join the call. You can generate the token just before starting the call, or generate and store it ahead of time based on your use case. Use thegenerateToken() method to create a call token:
- Java
- Kotlin
| Parameter | Description |
|---|---|
sessionId | The unique random session ID. In case you are using the ringing flow, the session ID is available in the Call object. |
userAuthToken | The user auth token is the logged-in user auth token which you can get by calling CometChat Chat SDK method CometChat.getUserAuthToken() |
Start Call Session
Use thestartSession() method to join a call session. This method requires a call token (generated in the previous step) and a CallSettings object that configures the call UI and behavior.
The CallSettings class configures the call UI and behavior. Use CallSettingsBuilder to create a CallSettings instance with the following required parameters:
| Parameter | Description |
|---|---|
activityContext | The activity context where the call UI will be displayed |
videoContainer | A RelativeLayout where the calling UI will be rendered |
callToken | The GenerateToken object received from generateToken() onSuccess |
- Java
- Kotlin
Call Settings
Configure the call experience using the followingCallSettingsBuilder methods:
| Method | Description |
|---|---|
setDefaultLayoutEnable(boolean) | Enables or disables the default call UI layout with built-in controls. true shows the default layout with end call, mute, video toggle buttons. false hides the button layout. Default: true |
setIsAudioOnly(boolean) | Sets whether the call is audio-only or audio-video. true for audio-only, false for audio-video. Default: false |
setEventListener(CometChatCallsEventsListener) | Sets the listener to receive call events. See Call Listeners for available callbacks. |
setMode(String) | Sets the call UI layout mode. Available: MODE_DEFAULT (grid), MODE_SPOTLIGHT (active speaker), MODE_SINGLE (one participant). Default: MODE_DEFAULT |
setAvatarMode(String) | Sets how avatars are displayed when video is off. Available: AVATAR_MODE_CIRCLE, AVATAR_MODE_SQUARE, AVATAR_MODE_FULLSCREEN. Default: AVATAR_MODE_CIRCLE |
setDefaultAudioMode(String) | Sets the initial audio output device. Available: AUDIO_MODE_SPEAKER, AUDIO_MODE_EARPIECE, AUDIO_MODE_BLUETOOTH, AUDIO_MODE_HEADPHONES |
startWithAudioMuted(boolean) | Starts the call with the microphone muted. Default: false |
startWithVideoMuted(boolean) | Starts the call with the camera turned off. Default: false |
showEndCallButton(boolean) | Shows or hides the end call button in the default layout. Default: true |
showSwitchCameraButton(boolean) | Shows or hides the switch camera button (front/back). Default: true |
showMuteAudioButton(boolean) | Shows or hides the mute audio button. Default: true |
showPauseVideoButton(boolean) | Shows or hides the pause video button. Default: true |
showAudioModeButton(boolean) | Shows or hides the audio mode selection button. Default: true |
showSwitchToVideoCallButton(boolean) | Shows or hides the button to upgrade an audio call to video. Default: true |
showRecordingButton(boolean) | Shows or hides the recording button. Default: false |
autoRecordOnCallStart(boolean) | Automatically starts recording when the call begins. Default: false |
enableVideoTileClick(boolean) | Enables or disables click interactions on video tiles in Spotlight mode. Default: true |
enableVideoTileDrag(boolean) | Enables or disables drag functionality for video tiles in Spotlight mode. Default: true |
setMainVideoContainerSetting(MainVideoContainerSetting) | Customizes the main video container. See Video View Customization. |
setIdleTimeoutPeriod(int) | Sets idle timeout in seconds. Warning appears 60 seconds before auto-termination. Default: 180 seconds. v4.1.0+ |
Call Listeners
TheCometChatCallsEventsListener interface provides real-time callbacks for call session events, including participant changes, call state updates, and error conditions. Register this listener in any activity or fragment where you need to respond to call events.
Each listener requires a unique listenerId string. This ID is used to:
- Prevent duplicate registrations — Re-registering with the same ID replaces the existing listener
- Enable targeted removal — Remove specific listeners without affecting others
- Java
- Kotlin
Events
| Event | Description |
|---|---|
onCallEnded() | Invoked when the call session terminates for a 1:1 call. Both participants receive this callback. Only fires for calls with exactly 2 participants. |
onSessionTimeout() | Invoked when the call is auto-terminated due to inactivity (default: 180 seconds). Warning appears 60 seconds before. v4.1.0+ |
onCallEndButtonPressed() | Invoked when the local user taps the end call button. For ringing flow, call CometChat.endCall(). For standalone, call CometChatCalls.endSession(). |
onUserJoined(user: RTCUser) | Invoked when a remote participant joins. The user contains UID, name, and avatar. |
onUserLeft(user: RTCUser) | Invoked when a remote participant leaves the call session. |
onUserListChanged(users: ArrayList<RTCUser>) | Invoked whenever the participant list changes (join or leave events). |
onAudioModeChanged(devices: ArrayList<AudioMode>) | Invoked when available audio devices change (e.g., Bluetooth connected). |
onCallSwitchedToVideo(info: CallSwitchRequestInfo) | Invoked when an audio call is upgraded to a video call. |
onUserMuted(muteObj: RTCMutedUser) | Invoked when a participant’s mute state changes. |
onRecordingToggled(info: RTCRecordingInfo) | Invoked when call recording starts or stops. |
onError(e: CometChatException) | Invoked when an error occurs during the call session. |
End Call Session
Ending a call session properly is essential to release media resources (camera, microphone, network connections) and update call state across all participants. The termination process differs based on whether you’re using the Ringing flow or Session Only flow.Ringing Flow
When using the Ringing flow, you must coordinate between the CometChat Chat SDK and the Calls SDK to properly terminate the call and notify all participants.The Ringing flow requires calling methods from both the Chat SDK (
CometChat.endCall()) and the Calls SDK (CometChatCalls.endSession()) to ensure proper call termination and participant notification.
onCallEndButtonPressed() callback is triggered. You must call CometChat.endCall() inside this callback to properly terminate the call and notify other participants. This triggers the onCallEnded() callback for the remote participant.
- Java
- Kotlin
onCallEnded() callback):
Call CometChat.clearActiveCall() to clear the local call state, then call CometChatCalls.endSession() to release media resources.
- Java
- Kotlin
Session Only Flow
When using the Session Only flow (direct call without ringing), you only need to call the Calls SDK method to end the session. There’s no need to notify the Chat SDK since no call signaling was involved. CallCometChatCalls.endSession() in the onCallEndButtonPressed() callback to release all media resources and disconnect from the call session.
- Java
- Kotlin
Methods
These methods are available for performing custom actions during an active call session. Use them to build custom UI controls or implement specific behaviors based on your use case.These methods can only be called when a call session is active.
Switch Camera
Toggles between the front and rear camera during a video call. Useful for allowing users to switch their camera view without leaving the call.- Java
- Kotlin
Mute Audio
Controls the local audio stream transmission. When muted, other participants cannot hear the local user.true— Mutes the microphone, stops transmitting audiofalse— Unmutes the microphone, resumes audio transmission
- Java
- Kotlin
Pause Video
Controls the local video stream transmission. When paused, other participants see a frozen frame or avatar instead of live video.true— Pauses the camera, stops transmitting videofalse— Resumes the camera, continues video transmission
- Java
- Kotlin
Set Audio Mode
Routes the audio output to a specific device. Use this to let users choose between speaker, earpiece, or connected audio devices. Available modes:CometChatCallsConstants.AUDIO_MODE_SPEAKER— Device speaker (loudspeaker)CometChatCallsConstants.AUDIO_MODE_EARPIECE— Phone earpieceCometChatCallsConstants.AUDIO_MODE_BLUETOOTH— Connected Bluetooth deviceCometChatCallsConstants.AUDIO_MODE_HEADPHONES— Wired headphones
- Java
- Kotlin
Enter PIP Mode
Enter PIP Mode
Enters Picture-in-Picture mode, rendering the call view in a small floating window. This allows users to multitask while staying on the call. Ensure your app has PIP support enabled in the manifest.- Java
- Kotlin
Exit PIP Mode
Exits Picture-in-Picture mode and returns the call view to its original full-screen or embedded layout.- Java
- Kotlin
Switch To Video Call
Upgrades an ongoing audio call to a video call. This enables the camera and starts transmitting video to other participants. The remote participant receives theonCallSwitchedToVideo() callback.
- Java
- Kotlin
Start Recording
Starts recording the call session. The recording is saved to the CometChat server and can be accessed later. All participants receive theonRecordingToggled() callback when recording starts.
- Java
- Kotlin
Stop Recording
Stops an ongoing call recording. All participants receive theonRecordingToggled() callback when recording stops.
- Java
- Kotlin
End Call
Terminates the current call session and releases all media resources (camera, microphone, network connections). After calling this method, the call view should be closed.- Java
- Kotlin
Best Practices
Always Remove Call Event Listeners
Always Remove Call Event Listeners
Remove call event listeners in
onDestroy() or onPause() to prevent memory leaks. Use unique listener IDs to manage multiple listeners across different activities or fragments.Validate Video Container
Validate Video Container
Ensure the
RelativeLayout for the video container exists in your XML layout before calling startSession(). The container must be visible and properly sized to display video streams.Handle Token Generation Errors
Handle Token Generation Errors
Always implement error handling for
generateToken(). Token generation can fail due to network issues or invalid session IDs. Inform users and provide retry options.Configure Call Settings Appropriately
Configure Call Settings Appropriately
Set
setIsAudioOnly(true) for audio-only calls to save bandwidth and improve performance. Use startWithAudioMuted() or startWithVideoMuted() when appropriate for user privacy.End Sessions Properly
End Sessions Properly
Always call
endSession() when leaving the call screen to release camera, microphone, and network resources. For ringing flow, call CometChat.endCall() first to notify participants.Troubleshooting
Token Generation Failed
Token Generation Failed
Symptom:
generateToken() fails with “Invalid session ID” or “Unauthorized” error.Cause: Invalid session ID or user not logged in.Solution: Verify the session ID is correct (from Call object in ringing flow or generated randomly for standalone). Ensure CometChat.login() was called successfully and getUserAuthToken() returns a valid token.Black Screen During Call
Black Screen During Call
Symptom: Call starts but shows a black screen instead of video.Cause: Video container not properly configured or camera permissions denied.Solution: Verify the
RelativeLayout exists in your XML and is visible. Check that camera permissions are granted in AndroidManifest.xml and at runtime. Ensure setIsAudioOnly(false) is set for video calls.Call Session Won't Start
Call Session Won't Start
Symptom:
startSession() fails or doesn’t trigger any callbacks.Cause: Invalid call token or missing calling setup.Solution: Ensure you’ve completed the Calling Setup including adding the Calls SDK dependency. Verify the GenerateToken object is valid and not expired. Check that the activity context is valid.Audio Not Working
Audio Not Working
Symptom: Video works but no audio is transmitted or received.Cause: Microphone permissions denied or audio muted.Solution: Check that microphone permissions are granted. Verify
startWithAudioMuted(false) is set. Test audio output device using setAudioMode() to switch between speaker and earpiece.