This documentation is for reference only. We are no longer onboarding new customers to Programmable Video. Existing customers can continue to use the product until December 5, 2026.
We recommend migrating your application to the API provided by our preferred video partner, Zoom. We've prepared this migration guide to assist you in minimizing any service disruption.
The Twilio Programmable Video SDKs use Semantic Versioning.
Bug Fixes
Known issues
LocalAudioTrack
or
LocalVideoTrack
might not be seen by Participants. As a result, tracks published after a
Room.State.RECONNECTED
event might not be subscribed to by a
RemoteParticipant
.
Size Report
ABI | APK Size Impact |
---|---|
universal | 22.5MB |
armeabi-v7a | 5MB |
arm64-v8a | 5.8MB |
x86 | 6.1MB |
x86_64 | 6.2MB |
API Changes
ConnectOptions.Builder.enableNetworkQuality
property to true
when connecting to a Group Room.
LocalParticipant.getNetworkQualityLevel()
. Note, this will return NETWORK_QUALITY_LEVEL_UNKNOWN
if:
ConnectOptions.networkQualityEnabled
property was set to
false
onNetworkQualityLevelChanged
method on your
LocalParticipant.Listener
will allow you to receive callbacks when the network quality level changes
_24// Enable network quality_24ConnectOptions connectOptions =_24 new ConnectOptions.Builder(token)_24 .roomName(roomName)_24 .enableNetworkQuality(true)_24 .build();_24_24// Override onNetworkLevelChanged to observe network quality level changes_24LocalParticipant.Listener localParticipantListener = new LocalParticipant.Listener() {_24 ..._24_24 @Override_24 public void onNetworkQualityLevelChanged(_24 @NonNull LocalParticipant localParticipant,_24 @NonNull NetworkQualityLevel networkQualityLevel) {}_24}_24_24// Connect to room and register listener_24Room room = Video.connect(context, connectOptions, roomListener);_24LocalParticipant localParticipant = room.getLocalParticipant();_24localParticipant.setListener(localParticipantListener);_24_24// Get current network quality_24localParticipant.getNetworkQualityLevel();
For more information, refer to the API docs and to the Network Quality Tutorial.
Known issues
LocalAudioTrack
or
LocalVideoTrack
might not be seen by Participants. As a result, tracks published after a
Room.State.RECONNECTED
event might not be subscribed to by a
RemoteParticipant
.
Size Report
ABI | APK Size Impact |
---|---|
universal | 22.5MB |
armeabi-v7a | 5MB |
arm64-v8a | 5.8MB |
x86 | 6.1MB |
x86_64 | 6.2MB |
Enhancement
Known issues
LocalAudioTrack
or
LocalVideoTrack
might not be seen by Participants. As a result, tracks published after a
Room.State.RECONNECTED
event might not be subscribed to by a
RemoteParticipant
.
Size Report
ABI | APK Size Impact |
---|---|
universal | 22.5MB |
armeabi-v7a | 5MB |
arm64-v8a | 5.8MB |
x86 | 6.1MB |
x86_64 | 6.2MB |
Bug Fixes
CameraCapturer.State
when error occurs.
Known issues
LocalAudioTrack
or
LocalVideoTrack
might not be seen by Participants. As a result, tracks published after a
Room.State.RECONNECTED
event might not be subscribed to by a
RemoteParticipant
.
Size Report
ABI | APK Size Impact |
---|---|
universal | 22.5MB |
armeabi-v7a | 5MB |
arm64-v8a | 5.8MB |
x86 | 6.1MB |
x86_64 | 6.2MB |
The Dominant Speaker Detection API sends events to your application every time the dominant speaker changes. You can use those events to improve the end user's experience by, for example, highlighting which participant is currently talking.
The Dominant Speaker Detection API is only available for Group Rooms. To enable dominant speaker detection, set the ConnectOptions.dominantSpeakerEnabled
property to true
. Use Room.getDominantSpeaker()
to determine the current dominant speaker. Implement Room.Listener.onDominantSpeakerChanged()
method to receive callbacks when the dominant speaker changes.
For more information, refer to the API docs and to the dominant speaker tutorial
This release is available here
_12 ConnectOptions connectOptions =_12 new ConnectOptions.Builder(token)_12 .roomName(roomName)_12 .enableDominantSpeaker(true)_12 .build();_12Room room = Video.connect(context, connectOptions, roomListener);_12_12@Override_12void onDominantSpeakerChanged(_12 @NonNull Room room, @Nullable RemoteParticipant remoteParticipant) {_12 // Handle dominant speaker change_12 }
Known issues
LocalAudioTrack
or
LocalVideoTrack
might not be seen by Participants. As a result, tracks published after a
Room.State.RECONNECTED
event might not be subscribed to by a
RemoteParticipant
.
Size Report
ABI | APK Size Impact |
---|---|
universal | 22.7MB |
armeabi-v7a | 5MB |
arm64-v8a | 5.9MB |
x86 | 6.2MB |
x86_64 | 6.3MB |
Improvements
enableAutomaticSubscription
to
ConnectOptions
.
enableAutomaticSubscription
toggles automatic track subscription. If set to
false
, the
LocalParticipant
will receive notifications of track publish events, but will not automatically subscribe to them. If
set to
true
, the
LocalParticipant
will automatically subscribe to tracks as they are published. If unset, the default is
true
. Note: This feature is only available for Group Rooms. Toggling the flag in a P2P room does not modify subscription behavior.
Known issues
LocalAudioTrack
or
LocalVideoTrack
might not be seen by Participants. As a result, tracks published after a
Room.State.RECONNECTED
event might not be subscribed to by a
RemoteParticipant
.
Size Report
ABI | APK Size Impact |
---|---|
universal | 22.5MB |
armeabi-v7a | 5MB |
arm64-v8a | 5.8MB |
x86 | 6.1MB |
x86_64 | 6.2MB |
Bug Fixes
ScreenCapturer
.
Known issues
LocalAudioTrack
or
LocalVideoTrack
might not be seen by Participants. As a result, tracks published after a
Room.State.RECONNECTED
event might not be subscribed to by a
RemoteParticipant
.
Size Report
ABI | APK Size Impact |
---|---|
universal | 22.5MB |
armeabi-v7a | 5MB |
arm64-v8a | 5.8MB |
x86 | 6.1MB |
x86_64 | 6.2MB |
Improvements
Known issues
LocalAudioTrack
or
LocalVideoTrack
might not be seen by Participants. As a result, tracks published after a
Room.State.RECONNECTED
event might not be subscribed to by a
RemoteParticipant
.
Size Report
ABI | APK Size Impact |
---|---|
universal | 22.5MB |
armeabi-v7a | 5MB |
arm64-v8a | 5.8MB |
x86 | 6.1MB |
x86_64 | 6.2MB |
Improvements
AudioSink
interface. When added to a
LocalAudioTrack
or
RemoteAudioTrack
, developers will receive a callback with the raw audio byte buffer from each audio frame. The example below demonstrates adding an
AudioSink
to a
LocalAudioTrack
.
_10AudioSink audioSink = (audioSample, encoding, sampleRate, channels) -> {_10 Log.v("AudioSink", "Received audio frame");_10};_10localAudioTrack.addSink(audioSink);
The AudioSink
can then be removed with the following code.
_10localAudioTrack.removeSink(audioSink);
Known issues
LocalAudioTrack
or
LocalVideoTrack
might not be seen by Participants. As a result, tracks published after a
Room.State.RECONNECTED
event might not be subscribed to by a
RemoteParticipant
.
Size Report
ABI | APK Size Impact |
---|---|
universal | 22.4MB |
armeabi-v7a | 5MB |
arm64-v8a | 5.8MB |
x86 | 6.1MB |
x86_64 | 6.2MB |
Bug Fixes
Camera2Capturer.switchCamera
which resulted in
onCameraSwitched
being invoked with a
null
camera ID
#379
Known issues
LocalAudioTrack
or
LocalVideoTrack
might not be seen by Participants. As a result, tracks published after a
Room.State.RECONNECTED
event might not be subscribed to by a
RemoteParticipant
.
Size Report
ABI | APK Size Impact |
---|---|
universal | 22.4MB |
armeabi-v7a | 5MB |
arm64-v8a | 5.8MB |
x86 | 6.1MB |
x86_64 | 6.2MB |
Bug Fixes
Room.getStats()
will raise a callback to the provided
StatsObserver
if called while
Room.getState() == Room.State.RECONNECTING
.
Known issues
LocalAudioTrack
or
LocalVideoTrack
might not be seen by Participants.
Size Report
ABI | APK Size Impact |
---|---|
universal | 22.4MB |
armeabi-v7a | 5MB |
arm64-v8a | 5.8MB |
x86 | 6.1MB |
x86_64 | 6.2MB |
Improvements
Reconnecting
to
Room.State
and new callbacks
onReconnecting
,
onReconnected
to
Room.Listener
. When the
LocalParticipant
experiences a network interruption in signaling or media, the room will transition to
Reconnecting
and
Room.Listener
will notify the developer of this new state via
onReconnecting
. If the connection is successfully restored,
Room.Listener
will notify the developer via
onReconnected
. However, if the connection could not be reestablished
Room.Listener
will notify the developer via
onDisconnected
.
OpusCodec.NAME
and
IsacCodec.NAME
to lowercase
Known issues
LocalAudioTrack
or
LocalVideoTrack
might not be seen by Participants.
Size Report
ABI | APK Size Impact |
---|---|
universal | 22.3MB |
armeabi-v7a | 5MB |
arm64-v8a | 5.7MB |
x86 | 6MB |
x86_64 | 6.2MB |