Skip to contentSkip to navigationSkip to topbar
Rate this page:
On this page

Changelog: Twilio Video Android 2.x


(warning)

Warning

This page 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, 2024(link takes you to an external page).
We recommend migrating your application to the API provided by our preferred video partner, Zoom. We've prepared this migration guide(link takes you to an external page) to assist you in minimizing any service disruption.

The Twilio Programmable Video SDKs use Semantic Versioning(link takes you to an external page).

Compatibility Notice - All versions
Please note that all 2.x versions are incompatible with Firefox 63+ in a Peer-to-Peer Room. For more information please review the Github Issue(link takes you to an external page).

2.2.1 (September 13, 2018)

221-september-13-2018 page anchor

Improvements

  • Adding a null video/audio codec to ConnectOptions will now throw an exception
  • Switched CI provider for build, test, and release pipeline.

Known issues


2.2.0 (August 30th, 2018)

220-august-30th-2018 page anchor

Features

  • Added flag to IceOptions abortOnIceServerTimeout that tells the client whether to continue or abort connecting to a Room when Ice fails to connect.
  • Added parameter to IceOptions iceServersTimeout that allows control of the timeout period when trying to retrieve Ice servers.
  • Added VideoTextureView . VideoTextureView is similar to VideoView but subclasses TextureView instead of SurfaceView . Unlike SurfaceView, TextureView does not create a separate window but behaves as a regular View. This key difference allows a TextureView to be moved, transformed, animated, etc. For more see the TextureView documentation(link takes you to an external page) . If you were previously using this gist(link takes you to an external page) , please update your applications to use the VideoTextureView provided with the SDK. NOTE : VideoTextureView can experience dead locking on API Level 19 or below due to a WebRTC bug(link takes you to an external page) . Use with discretion.

Known issues


2.1.1 (July 13th, 2018)

211-july-13th-2018 page anchor

Improvements

  • Updated Room.Listener documentation to provide more clarity about when onRecording callbacks are received.

Known issues

  • Network handoff, and subsequent connection renegotiation is not supported for IPv6 networks #72
  • Participant disconnect event can take up to 120 seconds to occur #80 #73
  • Codec preferences do not function correctly in a hybrid codec Group Room.
  • The SDK is not side-by-side compatible with other WebRTC based libraries #340(link takes you to an external page)
  • In a P2P room, participants will not receive any media or data tracks published by participants using Firefox 63 or later. #377(link takes you to an external page)
  • Data Tracks might not be subscribed with Chrome 76+ in a Peer-to-Peer Room. #433(link takes you to an external page)

2.1.0 (May 29th, 2018)

210-may-29th-2018 page anchor

Features

  • Added simulcast property to Vp8Codec . Enabling simulcast causes the encoder to generate multiple spatial and temporal layers for the video that is published. Simulcast should only be enabled in a Group Room.

Bug Fixes

  • Fixed a bug where the SDK could crash when unsubscribing from a data track and disconnecting from the room at the same time.
  • Fixed a rare crash that occurs when disconnecting from a Room .
  • Fixed an issue which could cause DTLS roles to be negotiated incorrectly in a multi-party Peer-to-Peer Room.

Known issues


2.0.2 (May 11th, 2018)

202-may-11th-2018 page anchor

Improvements

  • Updated Android Gradle Plugin to 3.1.1.

Bug Fixes

  • Relaxed state check in CameraCapturer when stopCapture is called and a camera closed event is not received.

Known issues


2.0.1 (April 26th, 2018)

201-april-26th-2018 page anchor

Improvements

  • Updated ScreenCapturer to capture at resolution based on the device's screen.

Bug Fixes

  • Fixed bug in VideoCapturer API where VideoPixelFormat.RGBA_8888 frames were not rotated before provided to video broadcaster. This bug would result in frames not being oriented properly when rendered by participants.

Known issues


2.0.0 (April 17th, 2018)

200-april-17th-2018 page anchor

We've promoted 2.0.0-beta5 to 2.0.0 as our first General Availability release.

2.0.0-beta5 (April 12th, 2018)

200-beta5-april-12th-2018 page anchor

Bug Fixes

Known issues

2.0.0-beta4 (April 4th, 2018)

200-beta4-april-4th-2018 page anchor

Improvements

  • Removed trackId from BaseTrackStats . trackSid or trackName can be used to identify track stats in a StatsReport .
  • Removed getTrackId from LocalAudioTrack , LocalVideoTrack , and LocalDataTrack .
  • Added getSid to RemoteAudioTrack , RemoteVideoTrack , and RemoteDataTrack .
  • Updated Android Gradle Plugin version to 3.1.0 and Gradle version to 4.4 .
  • SDK now defers to WebRTC to validate ice servers and returns an error when a connection attempt fails due to invalid servers.
  • Reduced the time needed to shutdown the signaling stack while disconnecting from a Room.
  • Increased the signaling disconnect timeout interval to 1 second.
  • Enable monotonic clock support in the signaling client.
  • Initial connect message now includes client version metadata.
  • Converted AudioCodec and VideoCodec from enums to abstract classes with concrete implementations. The subclasses of AudioCodec and VideoCodec are the following:
    • AudioCodec
      • IsacCodec
      • OpusCodec
      • PcmaCodec
      • PcmuCodec
      • G722Codec
    • VideoCodec
      • Vp8Codec
      • H264Codec
      • Vp9Codec

The following snippets demonstrate the before and after for setting codec preferences.


_13
// Setting preferences before 2.0.0-beta4
_13
ConnectOptions aliceConnectOptions = new ConnectOptions.Builder(aliceToken)
_13
.roomName(roomName)
_13
.preferAudioCodecs(Collections.singletonList(VideoCodec.ISAC))
_13
.preferVideoCodecs(Collections.singletonList(VideoCodec.VP9))
_13
.build();
_13
_13
// Setting preferences with 2.0.0-beta4
_13
ConnectOptions aliceConnectOptions = new ConnectOptions.Builder(aliceToken)
_13
.roomName(roomName)
_13
.preferAudioCodecs(Collections.<AudioCodec>singletonList(new IsacCodec()))
_13
.preferVideoCodecs(Collections.<VideoCodec>singletonList(new Vp9Codec()))
_13
.build();

Bug Fixes

  • Fixed a bug where the SDK hangs if DNS resolution fails and the user does not initiate disconnect.
  • Resolved an issue with clock rollover in the Room signaling layer that resulted in high CPU usage and disconnects.
  • The signaling client no longer logs access tokens.

Known issues

2.0.0-beta3 (March 27th, 2018)

200-beta3-march-27th-2018 page anchor

Improvements

  • Improved internal logic for retrieving ice servers and resolving outbound DNS.

Bug Fixes

  • ICE URIs using the turns and stuns scheme are now supported. The SDK will now use turns by default if turn is enabled for your Room.
  • Resolved a condition where ICE candidates might not be applied in Peer-to-Peer Rooms.
  • Quieted unnecessary warning logs when preferring codecs.
  • Fixed a bug where onDisconnected was not getting invoked due to a race condition between a network handover and a user initiated disconnect call.

Known issues

2.0.0-beta2 (March 5th, 2018)

200-beta2-march-5th-2018 page anchor

Bug Fixes

Known issues

2.0.0-beta1 (February 7th, 2018)

200-beta1-february-7th-2018 page anchor

Improvements

  • Updated targetSdkVersion to 27
  • Updated buildToolsVersion to 27.0.3
  • Updated Android Gradle plugin to to 3.0.1

Known issues

2.0.0-preview9 (January 25th, 2018)

200-preview9-january-25th-2018 page anchor

Improvements

  • Refactor internal reference counting of internal MediaFactory.

Bug Fixes

  • Don't publish Ice Candidate stats unless an active pair is present.

Known issues

2.0.0-preview8 (January 11th, 2018)

200-preview8-january-11th-2018 page anchor

Features

  • Added the following callbacks to RemoteParticipant.Listener
    • onAudioTrackSubscriptionFailed - Notifies listener that an audio track could not be subscribed to.
    • onVideoTrackSubscriptionFailed - Notifies listener that a video track could not be subscribed to.
    • onDataTrackSubscriptionFailed - Notifies listener that a data track could not be subscribed to.
  • Added trackSid to BaseTrackStats .

Bug Fixes

  • Removed public getEncodingOptions method from ConnectOptions .

Known issues

2.0.0-preview7 (December 26th, 2017)

200-preview7-december-26th-2017 page anchor

Improvements

  • Added version to javadoc title, header, and bottom.
  • LocalParticipant throws IllegalArgumentException when attempting to publish or unpublish a released Track .

Bug Fixes

  • Fixed crash disconnecting from a Room before being connected.

Known issues

2.0.0-preview6 (November 28th, 2017)

200-preview6-november-28th-2017 page anchor

Improvements

  • LocalDataTrack name is no longer provided via static create method argument. DataTrack names are now provided via DataTrackOptions. Reference snippets below:

    Creating a LocalDataTrack with name before 2.0.0-preview6


    _10
    String dataTrackName = "data";
    _10
    LocalDataTrack localDataTrack = LocalDataTrack.create(context, dataTrackName);

    Creating a LocalDataTrack with name after 2.0.0-preview6


    _10
    String dataTrackName = "data";
    _10
    DataTrackOptions dataTrackOptions = new DataTrackOptions.Builder()
    _10
    .name("data")
    _10
    .build();
    _10
    LocalDataTrack localDataTrack = LocalDataTrack.create(context, dataTrackOptions);

  • Updated javadoc to include note about VideoView#setVideoScaleType . Scale type will only be applied to dimensions defined as WRAP_CONTENT or a custom value. Setting a width or height to MATCH_PARENT results in the video being scaled to fill the maximum value of the dimension.
  • Add warning log when calling setVideoScaleType when width or height is set to MATCH_PARENT

Bug Fixes

  • Fixed a potential crash when publishing or unpublishing a Data Track.

Known issues

2.0.0-preview5 (November 9th, 2017)

200-preview5-november-9th-2017 page anchor

Features

  • Added the following callbacks to LocalParticipant.Listener
    • onAudioTrackPublicationFailed - Notifies listener that local participant failed to publish audio track.
    • onVideoTrackPublicationFailed - Notifies listener that local participant failed to publish video track.
    • onVideoTrackPublicationFailed - Notifies listener that local participant failed to publish video track.

Improvements

  • Include javadoc and sources jar with artifacts published to Bintray.
  • Added support for DataTrack API with Group rooms.
  • Updated to Build Tools 26.0.2
  • Support annotations and Relinker no longer exposed at compile time
  • Made Track interface public. Track is the common interface for an AudioTrack , VideoTrack , and DataTrack .
  • Twilio CDN no longer hosts the Video Android aar artifacts or Javadocs

Accessing Artifacts

accessing-artifacts page anchor

If you are downloading Video Android SDK artifacts from the Twilio CDN then there are two options available moving forward.

  1. Follow our Downloading Video SDKs Guide for Android .
  2. Download the artifacts directly from Bintray(link takes you to an external page) .

All Javadocs back to 1.0.0-preview1 are now hosted on Github Pages(link takes you to an external page) with the following URL scheme. https://twilio.github.io/twilio-video-android/docs/{version}

Bug Fixes

  • Fixed NPE when calling takePicture on CameraCapturer .

Known issues

2.0.0-preview4 (October 24th, 2017)

200-preview4-october-24th-2017 page anchor

Features

  • Added new DataTrack API. A data track represents a unidirectional source that allow sharing string and binary data with all participants of a Room. Data tracks function similarly to audio and video tracks and can be provided via ConnectOptions and published using LocalParticipant#publishTrack . Messages sent on the data track are not guaranteed to be delivered to all the participants. The following snippets demonstrate how to send and receive messages with data tracks.

Creating a LocalDataTrack


_10
LocalDataTrack localDataTrack = LocalDataTrack.create(context);

Connecting to a Room with a LocalDataTrack


_10
ConnectOptions connectOptions = new ConnectOptions.Builder(token)
_10
.dataTracks(Collections.singletonList(localDataTrack))
_10
.build();
_10
Video.connect(context, connectOptions, roomListener);

Publishing a LocalDataTrack


_10
// ... Connected to room
_10
LocalParticipant localParticipant = room.getLocalParticipant();
_10
_10
localParticipant.publish(localDataTrack);

Observing RemoteDataTrackPublication and RemoteDataTrack


_25
RemoteParticipant.Listener participantListener = new RemoteParticipant.Listener() {
_25
// ... complete interface ellided
_25
_25
// Participant has published data track
_25
@Override
_25
public void onDataTrackPublished(RemoteParticipant remoteParticipant,
_25
RemoteDataTrackPublication remoteDataTrackPublication);
_25
_25
// Participant has unpublished data track
_25
@Override
_25
public void onDataTrackUnpublished(RemoteParticipant remoteParticipant,
_25
RemoteDataTrackPublication remoteDataTrackPublication);
_25
_25
// Data track has been subscribed to and messages can be observed.
_25
@Override
_25
public void onDataTrackSubscribed(RemoteParticipant remoteParticipant,
_25
RemoteDataTrackPublication remoteDataTrackPublication,
_25
RemoteDataTrack remoteDataTrack);
_25
_25
// Data track has been unsubsubscribed from and messages cannot be observed.
_25
@Override
_25
public void onDataTrackUnsubscribed(RemoteParticipant remoteParticipant,
_25
RemoteDataTrackPublication remoteDataTrackPublication,
_25
RemoteDataTrack remoteDataTrack);
_25
};

Sending messages on LocalDataTrack


_10
String message = "Hello DataTrack!";
_10
ByteBuffer messageBuffer = ByteByffer.wrap(new byte[]{ 0xf, 0xe });
_10
_10
localDataTrack.send(message);
_10
localDataTrack.send(messageBuffer);

Observing messages from data track


_12
RemoteDataTrack.Listener dataTrackListener = new RemoteDataTrack.Listener() {
_12
@Override
_12
public void onMessage(String message) {
_12
// Should print "Hello DataTrack!"
_12
Log.d(TAG, String.format("Received data track message: %s", message));
_12
}
_12
_12
@Override
_12
public void onMessage(ByteBuffer message) {
_12
Log.d(TAG, "Received message buffer on data track!");
_12
}
_12
};

Improvements

  • Moved pre-defined aspect ratios from VideoConstraints class to AspectRatio class.
  • Local audio, video, and data tracks return their track IDs for getName if no name was specified.
  • Improved threading contract.

Bug Fixes

Known issues

2.0.0-preview3 (September 22nd, 2017)

200-preview3-september-22nd-2017 page anchor

Improvements

  • Upgraded to Android Oreo from Nougat

Bug Fixes

  • Fixed case on some devices where CameraCapturer incorrectly reported a failure to close the camera.
  • Improved echo cancellation on Nexus 6P and Nexus 6 by enabling hardware echo canceller and disabling OpenSL ES.
  • Fixed crash disconnecting from Room that has not connected #116(link takes you to an external page)

Known issues

2.0.0-preview2 (September 14th, 2017)

200-preview2-september-14th-2017 page anchor

Bug Fixes

  • Fixed crash when disconnecting from a Room immediately after unpublishing a local track.

Known issues

2.0.0-preview1 (September 11th, 2017)

200-preview1-september-11th-2017 page anchor

Features

  • Added EncodingParameters which constrains how much bandwidth is used to share audio and video. This object has been added to ConnectOptions and can also be set on LocalParticipant after joining a Room .
  • Added two static create methods to LocalAudioTrack and LocalVideoTrack that allow creating named tracks. The following snippet demonstrates how to create a video track named "screen".

_10
LocalVideoTrack screenVideoTrack = LocalVideoTrack.create(context,
_10
true,
_10
screenCapturer,
_10
"screen");

  • Moved getTrackId from Track to LocalAudioTrack and LocalVideoTrack .
  • Added AudioCodec and VideoCodec as part of the new codec preferences API. Audio and video codec preferences can be set in ConnectOptions . The following snippet demonstrates how to prefer the iSAC audio codec and VP9 video codec.

_10
ConnectOptions aliceConnectOptions = new ConnectOptions.Builder(aliceToken)
_10
.roomName(roomName)
_10
.preferAudioCodecs(Collections.singletonList(VideoCodec.ISAC))
_10
.preferVideoCodecs(Collections.singletonList(VideoCodec.VP9))
_10
.build();

  • Added RemoteAudioTrack and RemoteVideoTrack. These new objects extend AudioTrack and VideoTrack respectively and come with the following new method:
    • getName - Returns the name of the track or an empty string if no name is specified.
  • Added enablePlayback to new RemoteAudioTrack which allows developers to mute the audio received from a RemoteParticipant .
  • Added RemoteAudioTrackPublication which represents a published RemoteAudioTrack. This new class contains the following methods:
    • getTrackSid - Returns the identifier of a remote video track within the scope of a Room .
    • getTrackName - Returns the name of the track or an empty string if no name was specified.
    • isTrackEnabled - Checks if the track is enabled.
    • getAudioTrack - Returns the base class object of the remote audio track published.
    • getRemoteAudioTrack - Returns the remote audio track published.
  • Added RemoteVideoTrackPublication which represents a published RemoteVideoTrack. This new class contains the following methods:
    • getTrackSid - Returns the identifier of a remote video track within the scope of a Room .
    • getTrackName - Returns the name of the track or an empty string if no name was specified.
    • isTrackEnabled - Checks if the track is enabled.
    • getAudioTrack - Returns the base class object of the remote audio track published.
    • getRemoteAudioTrack - Returns the remote audio track published.
  • Added LocalAudioTrackPublication which represents a published LocalAudioTrack. This new class contains the following methods:
    • getTrackSid - Returns the identifier of a local video track within the scope of a Room .
    • getTrackName - Returns the name of the track or an empty string if no name was specified.
    • isTrackEnabled - Checks if the track is enabled.
    • getAudioTrack - Returns the base class object of the local audio track published.
    • getLocalAudioTrack - Returns the local audio track published.
  • Added LocalVideoTrackPublication which represents a published LocalVideoTrack. This new class contains the following methods:
    • getTrackSid - Returns the identifier of a local video track within the scope of a Room .
    • getTrackName - Returns the name of the track or an empty string if no name was specified.
    • isTrackEnabled - Checks if the track is enabled.
    • getAudioTrack - Returns the base class object of the local audio track published.
    • getLocalAudioTrack - Returns the local audio track published.
  • Converted Participant to an interface and migrated previous functionality into RemoteParticipant . LocalParticipant and the new RemoteParticipant implement Participant .
  • Added RemoteParticipant#getRemoteAudioTracks and RemoteParticipant#getRemoteVideoTracks which return List<RemoteAudioTrackPublication> and List<RemoteVideoTrackPublication> respectively.
  • Moved Participant.Listener to RemoteParticipant.Listener and changed the listener to return RemoteParticipant , RemoteAudioTrackPublication , and RemoteVideoTrackPublication in callbacks.
  • Renamed the following RemoteParticipant.Listener callbacks:
    • onAudioTrackAdded renamed to onAudioTrackPublished .
    • onAudioTrackRemoved renamed to onAudioTrackUnpublished .
    • onVideoTrackAdded renamed to onVideoTrackPublished .
    • onVideoTrackRemoved renamed to onVideoTrackUnpublished .
  • Added the following callbacks to RemoteParticipant.Listener:
    • onAudioTrackSubscribed - Indicates when audio is flowing from a remote participant's audio track. This callback includes the RemoteAudioTrack that was subscribed to.
    • onAudioTrackUnsubscribed - Indicates when audio is no longer flowing from a remote participant's audio track. This callback includes the RemoteAudioTrack that was subscribed to.
    • onVideoTrackSubscribed - Indicates when video is flowing from a remote participant's video track. This callback includes the RemoteVideoTrack that was subscribed to.
    • onVideoTrackUnsubscribed - Indicates when video is no longer flowing from a remote participant's video track. This callback includes the RemoteVideoTrack that was subscribed to.
  • Renamed TrackStats to RemoteTrackStats , AudioTrackStats to RemoteAudioTrackStats , and VideoTrackStats to RemoteVideoTrackStats
  • Renamed LocalParticipant#addAudioTrack and LocalParticipant#addVideoTrack to LocalParticipant#publishedTrack .
  • Added LocalParticipant.Listener which is provides the following callbacks:
    • onAudioTrackPublished - Indicates when a local audio track has been published to a Room .
    • onVideoTrackPublished - Indicates when a local video track has been published to a Room .
  • Added LocalParticipant#getLocalAudioTracks and LocalParticipant#getLocalVideoTracks which return List<LocalAudioTrackPublication> and List<LocalVideoTrackPublication> respectively.

Improvements

  • Null renderers cannot be added or removed from local or remote video tracks.
  • Renderers cannot be added or removed from a LocalVideoTrack that has been released.

Bug Fixes

Known issues


Rate this page: