Version 2.12.0 -- September 2017
Android 8.0 (Oreo) support.
This version fixes the following issues:
Publishing an audio-only stream after previously publishing video fails.
An error getting camera parameters when using the default camera capturer can cause the app to crash.
Audio output might go to the phone speaker when it is set to use the headset speaker.
Reusing a publisher without unpublishing from the first session can cause the app to crash.
Version 2.11.1 -- July 2017
Version 2.11.0 -- April 2017
Audio-tuning API. Use the
PublisherKit.Builder.audioBitrate(bitsPerSecond) method to set the
audio bitrate for a publisher. (For more information, see the reference documentation.)
This version adds errors for stream and connection limits. These errors are useful in large OpenTok sessions:
If you call
Session.connect() when the session's connection limit has been exceeded,
Session.SessionListener.onError() method is called with an OTError object
that has an error code set to
If you call
Session.Subscribe() when the session's stream limit has been exceeded,
SubscriberKit.SubscriberListener.onError() method is called with an OTError object
that has an error code set to
See the OpenTok developer guide on live interactive video broadcasts for information on supporting sessions with up to 3,000 real-time viewers.
Session.SessionOptions.isHwDecodingSupported() method is deprecated, and the method
has no functionality. The SDK no longer supports using the Android MediaCodec class to
This version fixes the following issues:
Cameras used by OpenTok publishers are now released when you call
Publishers reacquire cameras when you call
The camera display of a publisher was too dark on the Google Pixel. We added further improvements to those made in the 2.10.1 release.
This version fixes the following issues:
The camera display of a publisher was too dark on the Google Pixel.
Switching the audio driver to use handset (
BaseAudioDevice.OutputMode.Handset) was not working.
PublisherKit.setCapturer(capturer) method did not work properly.
This version adds new builder classes for constructing Session, Publisher, PublisherKit, Subscriber, and SubscriberKit objects:
These classes let you define any combination of initialization settings to be used when creating Session, Publisher, PublisherKit, Subscriber, and SubscriberKit objects.
The existing constructor methods of the Session, Publisher, PublisherKit, Subscriber, and SubscriberKit classes are deprecated.
This version of the OpenTok Android SDK is supported on Android 4.1+ (Jelly Bean, API Level 16). For a list of supported devices, see the Developer and client requirements section of the OpenTok Android SDK page at the TokBox developer center.
This version fixes an issue in which the video for a publisher was mirrored when using the back camera (on some devices).
This version adds 64-bit support (the armeabi64-v8a architecture).
The OpenTok Media Router now includes the OpenTok scalable video feature (previously in beta). For more information, see the OpenTok Media Router documentation.
This version adds a
Session.getCapabilities() method. Use this method
to check whether the client can publish streams to an OpenTok session,
based on the role assigned to the token used to connect to the session.
Please upgrade your apps to use the latest versions of the OpenTok server SDKs. These now use JSON web tokens (JWT) for authentication. JWT provides increased security along with standards-based encoding, decoding, and verification. The old form of authentication will expire in July 2017. Also, if you use the OpenTok REST API (instead of the server SDKs), please use JWT to authenticate calls to the OpenTok REST methods (see this topic on authentication).
Fixed bug where the publisher audio-video state was not preserved between application lifecycle events.
Fixed a potential memory leak in subscribers.
Fixed a Bluetooth routing issue on certain devices.
Fixed bug in which custom video renderers resulted in black videos.
This version fixes an audio-video synchronization issue in version 2.8.0.
Note that we have added TLS support to OpenTok TURN servers. This fixes media streaming for clients behind network firewalls that block non-TLS traffic over port 443.
The library is now provided as an aar file (not a jar file).
This version add support for Bluetooth SCO profile devices (earpieces and headsets) in the default audio driver.
This version improves quality for published audio.
Publisher.startPreview() method lets you display a publisher's camera video in the
Publisher's view before it starts streaming video.
Session.SessionOptionsProvider interface lets you decide when to use hardware video
are deprecated. You should use the new
Publisher.cycleCamera() method to cycle between cameras,
if there are multiple cameras on the device. Use the new
interface to define the behavior of the
Publisher.cycleCamera() method in a custom video
PublisherKit.setCapturer(BaseVideoCapturer capturer) method is deprecated. Instead, use the
PublisherKit.capturer property when creating a custom PublisherKit implementation. Or use the
Publisher(Context context, String name, BaseVideoCapturer capturer) constructor.
This version of the SDK uses WebRTC 49.
Setting the frame rate and resolution for a published stream using the default camera video
capturer. A new version of the Publisher constructor,
Publisher(context, name, resolution, fps),
includes parameters for setting the frame rate and resolution of the stream.
New methods for getting audio and video statistics for a stream. You can now set listeners to monitor the following statistics for a subscriber's stream:
See the documentation for the
SubscriberKit.setVideoStatsListener(VideoStatsListener listener) methods.
Added support for armeabi-v7a.
This version requires Android 4.1 (Jelly Bean, API Level 16) or later.
Session.reportIssue() method. You can call this method when your app
experiences an issue. The method returns an issue ID, which you can use with the
Inspector or when
discussing an issue with the TokBox support team.
This release fixes the following issues:
Subscribers did not display video when the stream changed from audio-only to audio-video.
Session.sendSignal() method when not connected to the session resulted in
the app crashing.
getData() method of the Connection object passed into the
Session.SignalListener.onSignalReceived(session, type, data, connection) method did
not return connection data.
When network connections were re-routed through a proxy or when Session objects were garbage collected, fatal signal 11 (SIGSEGV) errors would occur..
Reference table overflow errors caused apps to crash.
Added proxy support.
Note that the samples directory is no longer included in the SDK bundle. The sample code is now available at the open-source opentok-android-sdk-samples repository on GitHub. This allows us to keep it up to date and provide developers with latest version of the sample code. Feel free to clone the repo or download the source code to see the best-practice examples of OpenTok usage.
Added hardware-accelerated VP8 decoding of videos on the Nexus 5 with Android Lollipop+.
Fixed a bug that could occur when you reuse a Session object to reconnect to a session.
SessionIllegalState error in the
OpentokError.ErrorCode enum. This defines an error
code for an error that occurs if you try to connect to a session that is already connected or if
you try to subscribe to a stream that is no longer in the session.
This version adds support for testing on the Genymotion x86 emulator and the official Android x86 emulator images in combination with the Intel HAXM software for VM Acceleration.
This version adds support for screen sharing. When publishing a screen-sharing stream,
setPublisherVideoType(type) method of the PublisherKit object and pass in
PublisherKitVideoType.PublisherKitVideoTypeScreen. This optimizes the video encoding
for screen sharing. It is recommended to use a low frame rate (5 frames per second or lower)
with screen sharing. When using the
screen video type in a session that uses the OpenTok Media Server, you should
setAudioFallbackEnabled(boolean enabled) method of the Publisher object and
true to disable the audio-only fallback feature, so that the
video does not drop out in subscribers. See the OpenTok Media Router and media
When a stream is created in a session, you can determine the video type of the stream
(screen or camera) by calling the
getStreamVideoType() method of the Stream object.
The type of stream is defined by constants in the StreamVideoType enum:
To publish a screen-sharing stream, you need to implement a custom video capturer for the OTPublisherKit object. For sample code that publishes a screen-sharing stream, see the "screensharing" sample (in the samples directory).
You can disable the audio-only fallback feature for a published stream by calling the
setAudioFallbackEnabled(enabled) method of the PublisherKit object (passing in
The audio-fallback feature is available in sessions that use the OpenTok Media
Router. With the audio-fallback
feature enabled (the default), when the OpenTok Media Router determines that a stream's quality
has degraded significantly for a specific subscriber, it disables the video for that subscriber
in order to preserve audio quality. The audio-fallback feature is enabled by default.
This version of the SDK takes advantage of hardware acceleration for video decoding on devices that support it. These devices include the Nexus 5 (with OS before 5.0 Lollipop), the Asus K010, the Asus K011, and the Asus K013.
Updated to use BoringSSL, Google's fork of OpenSSL.
Fixed an issue with video not recovering when network conditions improve (after video was disabled, due to network conditions, in a session using the OpenTok Media Server).
The reason parameter has been added to the
SubscriberKit.VideoListener.onVideoDisabled(SubscriberKit subscriber, String reason)
SubscriberKit.onVideoDisabled(SubscriberKit subscriber, String reason)
methods. This parameter describes the reason why the subscriber video is being
disabled. In the previous version, this method was only called when the video
was disabled due to changes in the stream quality (in a session that uses the
OpenTok Media Router). In version 2.3.0, the method is also called if the
publisher stops sending a video stream or the subscriber stops subscribing to
it (and the
reason parameter value will be set accordingly).
New methods indicate when a subscriber's video stream starts (when there
previously was no video) or resumes (after video was disabled):
SubscriberKit.VideoListener.onVideoEnabled(SubscriberKit subscriber, String reason)
SubscriberKit.onVideoEnabled(SubscriberKit subscriber, String reason).
Use the new PublisherKit.AudioLevelListener and SubscriberKit.AudioLevelListener
classes to monitor changes in the audio levels of publishers and subscribers.
To use these, call the
setAudioLevelListener(listener) method of a PublisherKit
or SubscriberKit object.
is called when the OpenTok Media Router determines that the stream quality has
degraded and the video will be disabled if the quality degrades more. The new
is called when the stream quality improves. This feature is only available in
sessions that use the OpenTok Media Router (sessions with the
set to routed), not in sessions with the media mode set to relayed. The
SubscriberKit class also has protected
onVideoDisabledWarningLifted() methods that you can implement (instead of
the VideoListener methods) when you subclass SubscriberKit.
This version includes a new custom audio driver API. This lets you use custom audio streams and define the audio device used to capture and render audio data. The following new classes support the custom audio driver API:
AudioDeviceManager -- Use this class to set the app to specify a custom audio device for use in the app.
BaseAudioDevice -- Defines an audio device for use in a session.
BaseAudioDevice.AudioBus -- The audio bus marshals audio data between the network and the audio device.
BaseAudioDevice.AudioSettings -- Defines the format of the audio.
You can optimize the speaker usage for voice-only calls by calling
This sets the app to use the headset speaker (and the loudspeaker is disabled), which is
preferable in voice-only apps.
This build improves the video quality under poor network conditions.
The Session.PublisherListener and the
Session.onPublisherRemoved(publisher) methods have been removed. You
can monitor the
PublisherKit.PublisherListener.onStreamDestroyed(stream) methods to determine
when a publisher's stream is created and destroyed.
Updated to use version 1.0.1h of OpenSSL.
Session.unpublish() method now takes a PublisherKit parameter, instead of a Publisher
parameter. (The Publisher class extends PublisherKit.)
In a session with the media mode set to relayed, only one client can subscribe to a stream published by an Android device.
Video streaming is prevented on networks that have firewalls that use authenticated proxies. This is due to a core issue with the current underlying WebRTC implementation. (See this Chromium bug report.)
Audio is distorted in streams published from the Genymotion emulator.