The Twilio Programmable Voice SDKs allow you to add voice-over-IP (VoIP) calling into your native Android applications. See Android Getting Started Guide to begin using the SDK.
(information)
Info
As of June 2023, legacy Firebase Cloud Messaging (FCM) credentials have been deprecated and will be removed in June 2024, please upgrade to FCM v1 credentials as soon as possible. The Android Voice SDK already supports FCM v1 credentials and a migration guide has been prepared to help aid developers through the process. For information about the deprecation, please visit Google's announcement.
(warning)
Warning
The Twilio Programmable Voice SDKs use Semantic Versioning. Twilio supports version N-1 for 12 months after the first GA release of version N. We recommend that you upgrade to the latest version as soon as possible to avoid any breaking changes. Version 6.x is the latest Android version.
The Call Message Events (Beta), originally released in 6.3.3, has been promoted to GA. This release includes the following breaking changes from the beta.
Changed error code
31209
to
31212
. This error code is emitted when a call message payload exceeds the authorized limit.
Call Message types (CallMessage.messageType) are treated as strings instead of enumerated values.
The SDK no longer validates
CallMessage.messageType
and acts as a pass through for unknown message types in both directions (messages received by the SDK and those sent by the SDK).
Added new error code
31210
for invalid call message type when
sendMessage()
API is invoked with a
CallMessage
object where the
messageType
is
not
set to
user-defined-message
.
Call.CallMessageListener
methods have been updated to include the CallSid, which is a unique identifier for the Call or the CallInvite. The updated APIs are:
_10
public interface CallMessageListener {
_10
_10
void onMessageReceived(final String callSid, final CallMessage callMesssage);
_10
_10
void onMessageSent(final String callSid, final String voiceEventSID);
_10
_10
void onMessageFailure(final String callSid, final String voiceEventSID, final VoiceException error);
_10
}
Bug Fixes
Fixed issue preventing execution on Android API 21-23 devices starting with version 6.3.0.
Added new error code
31211
when
sendMessage()
API is invoked with a
CallMessage
object using the
CallInvite
object
when the
CallInvite
is not reached the
Ringing
state yet.
onMessageFailure()
callback will be invoked in this case
with the above mentioned error code.
Known Issues
Starting with SDK version 6.3.0, the required Android SDK version is 24 not 21. This issue is fixed as of SDK version 6.6.2.
Call Message types (CallMessage.messageType) are treated as strings instead of enumerated values.
The SDK no longer validates
CallMessage.messageType
and acts as a pass through for unknown message types in both directions (messages received by the SDK and those sent by the SDK).
Added new error code
31210
for invalid call message type when
sendMessage()
API is invoked with a
CallMessage
object where the
messageType
is
not
set to
user-defined-message
.
Added new Call Exception,
InvalidPhoneNumberException
that happens when a call is attempted with an invalid phone number id
error 13224
.
Enhancements
New
constant-audio-output-level
call quality warning added. This warning is triggered when the audio received is of a constant volume and can be used to determine when someone is speaking. Please note, if the remote party mutes the audio track or places the call on
hold
, this warning will
still be raised.
Metrics and events reported to Twilio Insights is now encoded via gzip to reduce transmission bandwidth.
Known Issues
Starting with SDK version 6.3.0, the required Android SDK version is 24 not 21. This issue is fixed as of SDK version 6.6.2.
A new AudioOptions API has been added, enabling audio processing operations on the local audio track/source.
Audio processing operations include Echo Cancellation, Automatic Gain Control, Noise Suppression, High Pass Filtering, setting jitter buffer max size in packets, and setting jitter buffer min delay in milliseconds (msec).
By default, all audio processing operations are enabled (set to true), the jitter buffer's maximum size is 200 packets, and the jitter buffer's minimum delay is 0 msec.
The default values can be modified and custom
AudioOptions
can be set as part of
ConnectOptions
when making outbound calls and/or as part of
AcceptOptions
when receiving incoming calls.
Example of customized
AudioOptions
when making an outbound call - In this example, Automatic Gain Control and High Pass Filtering are disabled, jitter buffer max size is set to 100 packets and jitter buffer min delay is set to 5 msec.
_10
connectOptions = new ConnectOptions.Builder(accessToken)
Example of customized
AudioOptions
when receiving an incoming call - In this example, Echo Cancellation and Noise Suppression are disabled, and jitter buffer max size is set to 50 packets.
Call.CallMessageListener
methods have been updated to include the CallSid, which is a unique identifier for the Call or the CallInvite. The updated APIs are:
_10
public interface CallMessageListener {
_10
_10
void onMessageReceived(final String callSid, final CallMessage callMesssage);
_10
_10
void onMessageSent(final String callSid, final String voiceEventSID);
_10
_10
void onMessageFailure(final String callSid, final String voiceEventSID, final VoiceException error);
_10
_10
}
LogParameters
class includes a
Throwable
field named
tr
. This allows us to log stack traces from Exceptions and other Throwable objects.
LogParameters
objects can now be constructed using
LogParameters.Builder()
that utilizes a builder pattern avoiding multi argument cumbersome direct constructors.
The existing constructors for
LogParameters
have been deprecated in favor of construction using
LogParamters.Builder()
and will be removed in the next major release.
Maintenance
Removed dead/unused c/c++ jni method, Java_com_twilio_voice_JniUtils_nativeJavaUtf16StringToStdString. This is somewhat related to github
issue 572
.
Added new Call Exception,
InvalidCallerIdException
that happens when a call is attempted with an invalid caller id
error 13214
.
Report the usage of Default Logger or Custom Logger to Twilio Insights. It only reports the type of Logger but not the actual log messages.
Known Issues
Starting with SDK version 6.3.0, the required Android SDK version is 24 not 21. This issue is fixed as of SDK version 6.6.2.
The SDK now supports sending and receiving in-call user-defined messages. Use the
Call::sendMessage(...)
method to send messages. Endpoints subscribed to the events of the call
will be receiving the messages. The
CallMessageInterface::onReceiveMessage(...)
callback will
be raised to the application when a message is received by the client. Please visit this
page
for more details about this
feature. Additionally, please see the following for more information on how to send and receive
messages on the server. This feature is currently in Beta. Example below.
_39
private static class TestCallMessageObserver implements Call.CallMessageListener {
_39
@Override
_39
public void onMessageReceived(CallMessage callMesssage) {
Provides a
LoggerInterface
interface. This interface contains a
log
method that is invoked with a
LogParameters
object every time a log message becomes available. The
LogParameters
object contains all the information relevant to the log message being delivered.
The Android SDK internally implements the
LoggerInterface
to provide default logging capabilities to stdout using android.util.Log.
Provides a
Voice.SetLogger(LoggerInterface)
method that allows setting a custom logger that conforms to
LoggerInterface
to which log messages will be delivered.
Provides a
Voice.GetLogger()
method that returns the logger that was previously set with
setLogger
. If no custom logger was set, this method returns the default logger currently used by the SDK.
Users can send their messages to be logged by the SDK using
Voice.GetLogger().log(LogParameters)
. This logs the message using the SDK's default logger.
Users can also implement custom loggers that conform to
LoggerInterface
to customize the logging mechanism, for eg., logging to a file, sending the logs to a server, etc.
The existing
Logger
class is deprecated and will be removed in the next major version release.
Known Issues
Starting with SDK version 6.3.0, the required Android SDK version is 24 not 21. This issue is fixed as of SDK version 6.6.2.
New edge
umatilla
is now supported. Set the
Voice.setEdge(...)
property before connecting or accepting the call.
Things to Note
Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
Fixed a crash when the home region specifier (
twr
) in the access token is
null
.
Things to Note
Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
The Voice Android SDK now supports Twilio Regional by providing the home region specifier in the access token header when calling the
Voice.register()
method, the
Voice.unregister()
method, or the
Voice.connect()
method.
Existing customers can now migrate their Voice use-cases to data centers in Ireland or Australia to establish data residency within the region. In addition, new customers may now select Ireland or Australia as their region of choice for Voice related use cases. There is no additional cost to use the new data centers in Ireland or Australia. To learn more about Regional Voice, check out our blog post or head over to our developer docs to get started.
Below is an example of specifying home region in the access token using the Twilio Node.js helper library:
_10
const accessToken = new twilio.jwt.AccessToken(
_10
credentials.accountSid,
_10
credentials.apiKeySid,
_10
credentials.apiKeySecret, {
_10
identity,
_10
ttl,
_10
region: 'au1',
_10
},
_10
);
The decoded header of your access token should look like this:
_10
{
_10
"alg": "HS256",
_10
"typ": "JWT",
_10
"cty": "twilio-fpa;v=1",
_10
"twr": "au1"
_10
}
Maintenance
The SDK compileSDKVersion and targetSDKVersion were updated to 31.
Updated
getStats(...)
API doc.
Bug Fixes
Fixed
IceCandidatePairStats
javadoc. Added
responsesSent
attribute to
IceCandidatePairStats
.
Things to Note
Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
The minimum Android SDK version has been increased from 16 to 21.
Enhancements
The voice SDK now validates full remote domain names while setting up the TLS connection.
Things to Note
Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
The SDK uses Unified Plan SDP semantics instead of Plan-B.
Things to Note
Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
Occasional native crash in
AsyncTask
of registration/unregistration and event
publishing. The crash has only been observed on API 18 devices and results from a
thread
safety bug in Android
. Similar crashes
have been reported in the popular networking library OkHttp
#1520#1338
. If this bug is impacting your applications,
please open an issue on
our quickstart
and
we will investigate potential fixes.
Voice Android artifacts are now published to MavenCentral instead of Bintray.
Ensure to include mavenCentral() listed in your project's buildscript repositories section:
_10
buildscript {
_10
repositories {
_10
mavenCentral()
_10
...
_10
}
_10
}
Voice Android SDK now publishes the checksum in the release notes.
Bug Fixes
Fixed a crash when
onNetworkChanged
was called during the teardown process.
Things to Note
Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
Occasional native crash in
AsyncTask
of registration/unregistration and event
publishing. The crash has only been observed on API 18 devices and results from a
thread
safety bug in Android
. Similar crashes
have been reported in the popular networking library OkHttp
#1520#1338
. If this bug is impacting your applications,
please open an issue on
our quickstart
and
we will investigate potential fixes.
Fixed a potential bug in the core module where the Logger could be accessed after being destroyed by another thread.
Library size report
ABI
APK Size Impact
x86
3.9MB
x86_64
3.9MB
armeabi-v7a
3.2MB
arm64-v8a
3.7MB
universal
14.4MB
Things to note
Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
Occasional native crash in
AsyncTask
of registration/unregistration and event
publishing. The crash has only been observed on API 18 devices and results from a
thread
safety bug in Android
. Similar crashes
have been reported in the popular networking library OkHttp
#1520#1338
. If this bug is impacting your applications,
please open an issue on
our quickstart
and
we will investigate potential fixes.
Updated the SDK to Android Gradle Plugin to 4.1.1.
Library size report
ABI
APK Size Impact
x86
3.9MB
x86_64
3.8MB
armeabi-v7a
3.2MB
arm64-v8a
3.7MB
universal
14.3MB
Things to note
Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
Occasional native crash in
AsyncTask
of registration/unregistration and event
publishing. The crash has only been observed on API 18 devices and results from a
thread
safety bug in Android
. Similar crashes
have been reported in the popular networking library OkHttp
#1520#1338
. If this bug is impacting your applications,
please open an issue on
our quickstart
and
we will investigate potential fixes.
Fixed a bug where caller did not receive the
onDisconnected
callback with error when the callee hung up.
Fixed a bug where callee did not receive the
onCancelledCallInvite
callback with error when signaling connection error happened.
Enhancements
Private IP addresses are masked in Release mode for the SDK logs and the
ice-candidate
Insights event payload.
Private IP addresses will not be masked in
Debug
mode. The
selected-ice-candidate-pair
event will contain private IP address of the local active ICE candidate for debugging purpose in both Release and Debug modes.
Stop publishing Voice Insights event with invalid access token.
Library size report
ABI
App Size Increase
universal
14.3MB
armeabi-v7a
3.2MB
arm64-v8a
3.7MB
x86
3.9MB
x86_64
3.8MB
Things to note
Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
Occasional native crash in
AsyncTask
of registration/unregistration and event
publishing. The crash has only been observed on API 18 devices and results from a
thread
safety bug in Android
. Similar crashes
have been reported in the popular networking library OkHttp
#1520#1338
. If this bug is impacting your applications,
please open an issue on
our quickstart
and
we will investigate potential fixes.
The SDK compileSDKVersion and targetSDKVersion were updated to 30 from 28. No changes are required to migrate to this version in an existing application.
Library size report
ABI
App Size Increase
universal
14.3MB
armeabi-v7a
3.2MB
arm64-v8a
3.7MB
x86
3.9MB
x86_64
3.8MB
Things to note
Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
Occasional native crash in
AsyncTask
of registration/unregistration and event
publishing. The crash has only been observed on API 18 devices and results from a
thread
safety bug in Android
. Similar crashes
have been reported in the popular networking library OkHttp
#1520#1338
. If this bug is impacting your applications,
please open an issue on
our quickstart
and
we will investigate potential fixes.
mos
calculation algorithm has been updated to make it monotonically decreasing with increasing
jitter
and
packets-lost-fraction
values over a range of
rtt
values. The final mos should always be in the range [1.0, 4.6].
Event Group
Level
Event Name
Description
pc-connection-state
DEBUG
new
Raised when peer connection state is new
pc-connection-state
DEBUG
connecting
Raised when peer connection state is connecting
pc-connection-state
DEBUG
connected
Raised when peer connection state is connected
pc-connection-state
DEBUG
disconnected
Raised when peer connection state is disconnected
pc-connection-state
ERROR
failed
Raised when peer connection state is failed
pc-connection-state
DEBUG
closed
Raised when peer connection state is closed
A new Insights event
selected-ice-candidate-pair
is reported with the active local ICE candidate and remote ICE candidate.
Event Group
Level
Event Name
Description
ice-candidate
DEBUG
selected-ice-candidate-pair
Raised when the active local and remote ICE candidates of the peer connection are determined
Defined new error code
Error Codes
ErrorCode
Error Message
53407
EXCEPTION_MEDIA_DTLS_TRANSPORT_FAILED
Media connection failed due to DTLS handshake failure
Fixed a crash bug when processing empty stats reports or stats reports without remote audio tracks.
SDK size update
The table below highlights the updated App Size Impact.
ABI
App Size Impact 5.3.0
App Size Impact 5.5.0
universal
15.2MB
14.3MB
armeabi-v7a
3.3MB
3.2MB
arm64-v8a
3.8MB
3.7MB
x86
4MB
3.9MB
x86_64
4.1MB
3.8MB
Library size report
ABI
App Size Increase
universal
14.3MB
armeabi-v7a
3.2MB
arm64-v8a
3.7MB
x86
3.9MB
x86_64
3.8MB
Things to note
Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
Occasional native crash in
AsyncTask
of registration/unregistration and event
publishing. The crash has only been observed on API 18 devices and results from a
thread
safety bug in Android
. Similar crashes
have been reported in the popular networking library OkHttp
#1520#1338
. If this bug is impacting your applications,
please open an issue on
our quickstart
and
we will investigate potential fixes.
Fixed a crash bug when processing empty stats reports or stats reports without remote audio tracks.
Library size report
ABI
App Size Increase
universal
15.3MB
armeabi-v7a
3.4MB
arm64-v8a
3.9MB
x86
4.1MB
x86_64
4.2MB
Things to note
Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
Occasional native crash in
AsyncTask
of registration/unregistration and event
publishing. The crash has only been observed on API 18 devices and results from a
thread
safety bug in Android
. Similar crashes
have been reported in the popular networking library OkHttp
#1520#1338
. If this bug is impacting your applications,
please open an issue on
our quickstart
and
we will investigate potential fixes.
Fixed a bug when attempting to execute work on the worker thread from a custom audio device.
Maintenance
Upgraded to Android Gradle Plugin 4.0.0 and Gradle 6.1.1
Starting with Voice Android SDK 5.4.1, the SDK is no longer binary compatible with applications that target Java 7. In order to use this and future releases, developers must upgrade their applications to target Java 8. Follow the snippet below for reference:
_10
android {
_10
compileOptions {
_10
sourceCompatibility 1.8
_10
targetCompatibility 1.8
_10
}
_10
}
Library size report
ABI
App Size Increase
universal
15.3MB
armeabi-v7a
3.4MB
arm64-v8a
3.9MB
x86
4.1MB
x86_64
4.2MB
Things to note
Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
Occasional native crash in
AsyncTask
of registration/unregistration and event
publishing. The crash has only been observed on API 18 devices and results from a
thread
safety bug in Android
. Similar crashes
have been reported in the popular networking library OkHttp
#1520#1338
. If this bug is impacting your applications,
please open an issue on
our quickstart
and
we will investigate potential fixes.
A
CallerInfo
object is introduced to represent information about the caller. Currently, this information is limited to SHAKEN/STIR status of incoming PSTN Calls, but may later be expanded to include CNAM, and other endpoint types.
isVerified
attribute represents whether or not the caller's phone number has been verified by Twilio using SHAKEN/STIR validation. The value of this attribute is
true
if the caller has been validated at 'A' level,
false
if the caller has been verified at any lower level or has failed validation. If SHAKEN/STIR information is unavailable for the caller or stir status value is
null
, the value of this attribute will be
null
.
CallInvite
class includes
getCallerInfo(..)
method that returns the
CallerInfo
of the caller.
Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
Occasional native crash in
AsyncTask
of registration/unregistration and event
publishing. The crash has only been observed on API 18 devices and results from a
thread
safety bug in Android
. Similar crashes
have been reported in the popular networking library OkHttp
#1520#1338
. If this bug is impacting your applications,
please open an issue on
our quickstart
and
we will investigate potential fixes.
Fixed a bug in
Voice.setRegion(..)
API that disallowed to use non default values.
Library size report
ABI
App Size Increase
universal
15.2MB
armeabi-v7a
3.4MB
arm64-v8a
3.9MB
x86
4.1MB
x86_64
4.1MB
Things to note
Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
Occasional native crash in
AsyncTask
of registration/unregistration and event
publishing. The crash has only been observed on API 18 devices and results from a
thread
safety bug in Android
. Similar crashes
have been reported in the popular networking library OkHttp
#1520#1338
. If this bug is impacting your applications,
please open an issue on
our quickstart
and
we will investigate potential fixes.
The trigger conditions for the warnings defined in the enumeration are defined as follows:
WARN_HIGH_RTT
- Round Trip Time (RTT) > 400 ms for 3 out of last 5 samples.
WARN_HIGH_JITTER
- Jitter > 30 ms for 3 out of last 5 samples.
WARN_HIGH_PACKET_LOSS
- Raised when average packet loss > 3% in last 7 samples. Cleared when average packet loss <= 1% in last 7 samples.
WARN_LOW_MOS
- Mean Opinion Score (MOS) < 3.5 for 3 out of last 5 samples.
WARN_CONSTANT_AUDIO_IN_LEVEL
- Raised when the standard deviation of audio input levels for last 10 samples is less than or equals 1% of the maximum possible audio input level (32767) i.e. 327.67 and the call is not in the muted state and the call is not on hold. Cleared when the standard deviation of audio input levels for last 10 samples is greater than 3% of the maximum possible audio input level.
A new method
getCallQualityWarnings()
is added to
Call
to retrieve the present set of call quality related warnings.
This release also adds the Mean Opinion Score (MOS) measurement
mos
to
RemoteAudioTrackStats
. Use
Call.getStats()
API during a call to retrieve the score. The
mos
is computed once per second. Since the MOS is calculated from network performance measurements, it can be used to indicate the current network condition to the user to provide better usability. See
API Docs
for more information.
Example:
_11
call.getStats(new StatsListener() {
_11
@Override
_11
public void onStats(@NonNull List<StatsReport> statsReports) {
for (RemoteAudioTrackStats remoteAudioStats : remoteAudioStatsList) {
_11
float mos = remoteAudioStats.mos;
_11
}
_11
}
_11
}
_11
});
This release includes support for the expansion of Twilio's Global Infrastructure via Edge Locations which allows customers to control their connectivity into and out of Twilio's platform. The Voice Android SDK uses these Edges to connect to Twilio's infrastructure via the new property
Voice.edge
. This new property supersedes the now deprecated
Voice.region
. See the
new Edge names
and how they map to the old region names.
Here is an example:
_10
// Connect using global low latency
_10
Voice.setEdge("roaming")
Below are the new methods signatures introduced in Voice class.
_10
@NonNull public static String getEdge();
_10
public static void setEdge(@NonNull String edge)
The following APIs have been deprecated in favor of the new methods.
_10
@NonNull public static String getRegion();
_10
public static void setRegion(@NonNull String region)
Added a Boolean property
enableIceGatheringOnAnyAddressPorts
in
CallOptions
that allows gathering of ICE candidates from "any address" ports. This allows applications to work in certain VPN environments.
Reference the following code snippet to enable or disable this feature. Note, enableIceGatheringOnAnyAddressPorts is disabled by default.
Configure enableIceGatheringOnAnyAddressPorts with ConnectOptions
_10
ConnectOptions connectOptions = new ConnectOptions.Builder(accessToken)
By default ICE gathering is done on all interfaces except some VPN type interfaces. This makes it impossible to connect to Twilio in networks that require the use of VPN. In this release, the new Boolean property
enableIceGatheringOnAnyAddressPorts
in
CallOptions
allows the gathering of ICE candidates from all available interfaces. This should be used in those networks where the default does not work. See
AcceptOptions.Builder.enableIceGatheringOnAnyAddressPorts
or
ConnectOptions.Builder.enableIceGatheringOnAnyAddressPorts
for more information.
Library size report
ABI
App Size Increase
universal
15.2MB
armeabi-v7a
3.4MB
arm64-v8a
3.9MB
x86
4.1MB
x86_64
4.1MB
Things to note
Voice.setRegion(..)
API disallows to use non default values.
Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
Occasional native crash in
AsyncTask
of registration/unregistration and event
publishing. The crash has only been observed on API 18 devices and results from a
thread
safety bug in Android
. Similar crashes
have been reported in the popular networking library OkHttp
#1520#1338
. If this bug is impacting your applications,
please open an issue on
our quickstart
and
we will investigate potential fixes.
The AudioDevice API is an advanced API that can be used to create innovative and sophisticated in-app audio capabilities. For example, enable pre-recorded messages to be played in-call, or apply noise reduction algorithms before playing out the received audio.
An AudioDevice is a logical device that is used to capture and render audio. The captured audio is sent to the remote party, and the received audio is rendered locally. By default, the SDK uses DefaultAudioDevice which uses the mic for capturing and the local speaker/earpiece/headset for rendering. The AudioDevice API allows for the creation of custom audio capturers and renderers. See this example and API docs to learn more about custom audio devices.
SDK size update
The AudioDevice feature requires additional native APIs that result in a small increase in SDK size. The table below highlights the updated App Size Impact.
ABI
App Size Impact 5.1.1
App Size Impact 5.2.0
universal
14.9MB
15.1MB
armeabi-v7a
3.3MB
3.3MB
arm64-v8a
3.8MB
3.9MB
x86
4MB
4MB
x86_64
4.1MB
4.1MB
Things to note
Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
Occasional native crash in
AsyncTask
of registration/unregistration and event
publishing. The crash has only been observed on API 18 devices and results from a
thread
safety bug in Android
. Similar crashes
have been reported in the popular networking library OkHttp
#1520#1338
. If this bug is impacting your applications,
please open an issue on
our quickstart
and
we will investigate potential fixes.
Fixed data types in event payload for Voice Insights events.
Fixed Voice Insights data with valid transport id value.
Things to Note
Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
Occasional native crash in
AsyncTask
of registration/unregistration and event
publishing. The crash has only been observed on API 18 devices and results from a
thread
safety bug in Android
. Similar crashes
have been reported in the popular networking library OkHttp
#1520#1338
. If this bug is impacting your applications,
please open an issue on
our quickstart
and
we will investigate potential fixes.
An ongoing call will automatically switch to a more preferred network type if one becomes available. The following are the network types listed in preferred order: ETHERNET, LOOPBACK, WIFI, VPN, and CELLULAR. For example, if a WIFI network becomes available whilst in a call that is using CELLULAR data, the call will automatically switch to using the WIFI network.
Attempts to re-establish the media connection will be done preemptively if no media flow is detected for 3 seconds.
Bug fixes
Fixed data types in event payload for Voice Insights events.
Things to note
Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
Occasional native crash in
AsyncTask
of registration/unregistration and event
publishing. The crash has only been observed on API 18 devices and results from a
thread
safety bug in Android
. Similar crashes
have been reported in the popular networking library OkHttp
#1520#1338
. If this bug is impacting your applications,
please open an issue on
our quickstart
and
we will investigate potential fixes.
The
HttpsURLConnection
thread is now tagged using
Traffic.setThreadStatsTag
. This change prevents warnings and/or crashes when an App is started using
strictMode
.
Application name, id, version, build number, and min/major sdk version are now published to Insights. This helps with isolating problems if an issue is encountered.
Things to note
Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
Occasional native crash in
AsyncTask
of registration/unregistration and event
publishing. The crash has only been observed on API 18 devices and results from a
thread
safety bug in Android
. Similar crashes
have been reported in the popular networking library OkHttp
#1520#1338
. If this bug is impacting your applications,
please open an issue on
our quickstart
and
we will investigate potential fixes.
Incoming call handling improvements. Previously, if we encountered network issues before an incoming call was answered or rejected, we disconnected the call. With this release, we will continue to try and establish a connection to Twilio for a maximum of 40 seconds before we disconnect the call.
We now publish the negotiated codec and its associated parameters to Insights.
Event Group
Level
Event Name
Description
settings
INFO
codec
Raised when the codec has been selected
Other improvements
Improved the way we perform DNS resolution. Previously, some DNS requests could indirectly block the main thread. This is no longer the case.
Things to note
Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
Occasional native crash in
AsyncTask
of registration/unregistration and event
publishing. The crash has only been observed on API 18 devices and results from a
thread
safety bug in Android
. Similar crashes
have been reported in the popular networking library OkHttp
#1520#1338
. If this bug is impacting your applications,
please open an issue on
our quickstart
and
we will investigate potential fixes.
This release introduces an update to the Programmable Voice call model. To upgrade your application please follow the migration guide.
Background
Prior to 5.0.0, when
Voice.register(...) is invoked, the Voice SDK registers for two push
notifications: a call and cancel push notification. The call and cancel push notification payloads
could then be passed as arguments to Voice.handleMessage(...) and your application would be
provided with a callback via MessageListener indicating if the message was a CallInvite
or CancelledCallInvite.
Starting with 5.0.0, when Voice.register(...) is invoked, the Voice SDK will register
for call push notifications and cancelled call invites will be determined via a signaling connection.
Voice.handleMessage(...) no longer processes cancel push notification payloads and will return
false if provided with a cancel message. As a result, developers must re-register via
Voice.register(...) after upgrading their application to 5.0.0 to stop receiving cancel push
notifications.
CallInvite and CancelledCallInvite updates
A valid call push notification, when passed to Voice.handleMessage(...), will still result in a CallInvite
being raised to the provided MessageListener. A CancelledCallInvite will be raised to
the provided MessageListener if any of the following events occur:
The call is prematurely disconnected by the caller.
The callee does not accept or reject the call within 30 seconds.
The Voice SDK is unable to establish a connection to Twilio.
A CancelledCallInvite will not be raised if a CallInvite is accepted or rejected.
Insights
To provide observability for incoming call cancellations the following Insights events have been added:
Event Group
Level
Event Name
Description
connection
INFO
listen
Raised when an attempt to listen for cancellations is made
connection
INFO
listening
Raised when an attempt to listen for cancellations has succeeded
connection
INFO
cancel
Raised when a cancellation has been reported
connection
ERROR
listening-error
Raised when an attempt to listen for cancellation has failed
registration
ERROR
unsupported-cancel-message-error
Raised when a "cancel" push notification is processed by the SDK. This version of the SDK does not support "cancel" push notifications
API updates
MessageListener.onCancelledCallInvite has been updated to the following signature.
The provided CallException will indicate if a call was cancelled as the result of an error. If
no error occurred, then the CallException is null.
Both
Voice.handleMessage(...)
methods require an Android
Context
as the first argument.
CallInvite
class includes
isValid(...)
utility method to validate whether the payload is a valid notification sent by Twilio. A valid notification payload will result in a
CallInvite
being raised via
MessageListener.onCallInvite(...)
callback when passed to
Voice.handleMessage(...)
.
Enabling insights and setting the region are now specified on the Voice class. These options were previously accessible on ConnectOptions and AcceptOptions.
Sending stats data to Insights is enabled by default.
The default region uses Global Low Latency routing, which establishes a connection with the closest region to the user.
Below are the new methods signatures introduced in Voice class.
_10
public static boolean isInsightsEnabled();
_10
public static void enableInsights(boolean enable);
_10
@NonNull public static String getRegion();
_10
public static void setRegion(@NonNull String region)
Introduced a new error code that gets surfaced when
handleMessage(..)
API is called with push notification bundle with
twilio.voice.cancel
as the
twi_message_type
.
Error Code
Level
Error Message
Description
31302
Error
Unsupported Cancel Message Error
This version of the SDK no longer supports processing cancel push notification messages. You must register via Voice.register(...) with this version of the SDK to stop receiving cancel push notification messages. Cancellations are now handled internally and reported to you on behalf of the SDK.
Enhancements
CLIENT-6757 Updated the Android Gradle Plugin to 3.5.0 and Gradle to 5.4.1.
Known issues
CLIENT-4943 Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
CLIENT-5242 Occasional native crash in
AsyncTask
of registration/unregistration and event
publishing. The crash has only been observed on API 18 devices and results from a
thread
safety bug in Android
. Similar crashes
have been reported in the popular networking library OkHttp
#1520#1338
. If this bug is impacting your applications,
please open an issue on
our quickstart
and
we will investigate potential fixes.
Differentiated Services Code Point (DSCP) Tagging API
The Differentiated Services Code Point (DSCP) Tagging API allows you to mark the audio packets with Expedited Forwarding (EF) for the purposes of improved packet routing. This
behavior is enabled by default. When enabled, supporting networks will prioritize audio packet delivery for improved audio quality.
Reference the following code snippet to control enabling DSCP.
Configure DSCP with ConnectOptions
_10
ConnectOptions connectOptions = new ConnectOptions.Builder(accessToken)
CLIENT-4943 Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
CLIENT-5242 Occasional native crash in
AsyncTask
of registration/unregistration and event
publishing. The crash has only been observed on API 18 devices and results from a
thread
safety bug in Android
. Similar crashes
have been reported in the popular networking library OkHttp
#1520#1338
. If this bug is impacting your applications,
please open an issue on
our quickstart
and
we will investigate potential fixes.
You can now retrieve the custom parameters set in your TwiML application from CancelledCallInvite. With this addition, you can for example, display a missed call notification with the caller's display name retrieved from the CancelledCallInvitegetCustomParamaters().
cancelledCallInvite.getCustomParameters() returns a map of key-value pair passed in the TwiML.
_10
"caller_first_name" -> "alice"
_10
"caller_last_name" -> "smith"
CLIENT-5845 Insights events
ringing
in the
connection
group guarantees to include
CallSid
.
Known Issues
CLIENT-4943 Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
CLIENT-5242 Occasional native crash in
AsyncTask
of registration/unregistration and event
publishing. The crash has only been observed on API 18 devices and results from a
thread
safety bug in Android
. Similar crashes
have been reported in the popular networking library OkHttp
#1520#1338
. If this bug is impacting your applications,
please open an issue on
our quickstart
and
we will investigate potential fixes.
CLIENT-6428 The SDK Android Gradle Plugin was updated from 3.3.2 to 3.4.2 and the Gradle version
was updated from 4.10.3 to 5.1.1.
CLIENT-6331
OpenSLES
is now disabled by default for
both incoming and outgoing calls unless explicitly enabled. To enable OpenSLES, execute the
following before invoking
Voice.connect(...)
or
CallInvite.accept(...)
:
tvo.webrtc.voiceengine.WebRtcAudioManager.setBlacklistDeviceForOpenSLESUsage(false)
.
Known Issues
CLIENT-4943 Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
CLIENT-5242 Occasional native crash in
AsyncTask
of registration/unregistration and event
publishing. The crash has only been observed on API 18 devices and results from a
thread
safety bug in Android
. Similar crashes
have been reported in the popular networking library OkHttp
#1520#1338
. If this bug is impacting your applications,
please open an issue on
our quickstart
and
we will investigate potential fixes.
The SDK compileSDKVersion and
targetSDKVersion
SDK was updated to 28 from 27. No changes are required to migrate to this version in an existing application.
Known Issues
CLIENT-4943 Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
CLIENT-5242 Occasional native crash in
AsyncTask
of registration/unregistration and event
publishing. The crash has only been observed on API 18 devices and results from a
thread
safety bug in Android
. Similar crashes
have been reported in the popular networking library OkHttp
#1520#1338
. If this bug is impacting your applications,
please open an issue on
our quickstart
and
we will investigate potential fixes.
By default, Opus codec is set up with a bitrate of around 32kbps (40-50kbps on the wire). With this release, you are able to set a custom max average bitrate transmission to better control how much bandwidth your VoIP application should use. See RFC-7587 7.1 for information about Max Average Bitrate.
The main purpose of this API is to set a lower max average bitrate to minimize bandwidth usage. This is particularly useful in deployments where bandwidth is a premium. Where bandwidth is not of concern, you do not need to use this API.
Max Average Bitrate can be set to as low as 6,000bps and as high as 51,000bps. Values outside this range are ignored and the default Opus operation mode is used. See API Docs for more information.
As would be expected, lowering the max average bitrate impacts audio quality. We don't recommend setting max average bitrate to a value below 8,000bps. On the other hand, setting values over 32,000bps will have negligible audio quality improvements.
For example, to set a new max average bitrate to 16,000bps:
_10
ConnectOptions connectOptions = new ConnectOptions.Builder(accessToken)
_10
.params(params)
_10
.preferAudioCodecs(Arrays.asList( new OpusCodec(16000)))
Programmable Voice Android SDK transmits data for VoIP calls and for
Insights
. With this release, we have reduced Insights related data consumption by around 25%. This was accomplished by reducing the events reporting interval.
The SDK now reports
ice-candidate
events to Insights. These events are raised when
OnIceCandidate
is called on the
PeerConnection
.
Known Issues
Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
Occasional native crash in
AsyncTask
of registration/unregistration and event
publishing. The crash has only been observed on API 18 devices and results from a
thread
safety bug in Android
. Similar crashes
have been reported in the popular networking library OkHttp
#1520#1338
. If this bug is impacting your applications,
please open an issue on
our quickstart
and
we will investigate potential fixes.
This release introduces the new Reconnecting State API. This API adds a new state RECONNECTING to Call.State and two new Call.Listener() callbacks, onReconnecting(...) and onReconnected(...).
Call reconnection capability has been available since SDK 3.0. For example, if a call is established over a Wi-Fi network and the Wi-Fi network becomes unavailable, the SDK will automatically switch the call over to the next available network.
This release adds the reconnection related callbacks. onReconnecting(...) indicates when a call is being reconnected due to a network disruption or network switch over and onReconnected(...) is called once the call has been re-connected. You can use this information to provide intuitive feedback to your App user when a reconnection is taking place.
Migration Guide
Please refer to our migration guide for more information about migrating from 3.x.
Known Issues
Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
Occasional native crash in
AsyncTask
of registration/unregistration and event
publishing. The crash has only been observed on API 18 devices and results from a
thread
safety bug in Android
. Similar crashes
have been reported in the popular networking library OkHttp
#1520#1338
. If this bug is impacting your applications,
please open an issue on
our quickstart
and
we will investigate potential fixes.
Insights events
reconnecting
and
reconnected
in the
connection
group are now documented in the Javadoc for the
Call
class.
CLIENT-6218 Insights events
53001
/
Signaling connection disconnected
and
53405
/
Media connection failed
in the
connection
group that are raised when attempting to reconnect are now raised with Insights level "warning". Previously, they were raised with level "error".
CLIENT-6257 Added
AddressIncompleteException
to indicate that the number of the callee is malformed.
Error Code
Error Message
31484
Address Incomplete
Bug Fixes
CLIENT-6205 Fixed an issue where a
31408
/
Request Timeout
would result in a
31005
/
Connection error
Known Issues
CLIENT-4943 Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
CLIENT-5242 Occasional native crash in
AsyncTask
of registration/unregistration and event
publishing. The crash has only been observed on API 18 devices and results from a
thread
safety bug in Android
. Similar crashes
have been reported in the popular networking library OkHttp
#1520#1338
. If this bug is impacting your applications,
please open an issue on
our quickstart
and
we will investigate potential fixes.
CLIENT-6282 The SDK can now be compiled alongside the Programmable Video SDK. Please perform the
following steps to properly upgrade to 3.2.0
Modify the classpath of any java files used from
org.webrtc.*
to
tvo.webrtc.*
. Calling
APIs to any class in
org.webrtc.*
will have no effect within the Voice SDK.
Perform the following modifications to your proguard file when compiling the Voice SDK for a
release build with obfuscation.
Change
-keep class org.webrtc.** { *; }
to
-keep class tvo.webrtc.** { *; }
Change
-dontwarn org.webrtc.**
to
-dontwarn tvo.webrtc.**
Known Issues
CLIENT-4943 Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
CLIENT-5242 Occasional native crash in
AsyncTask
of registration/unregistration and event
publishing. The crash has only been observed on API 18 devices and results from a
thread
safety bug in Android
. Similar crashes
have been reported in the popular networking library OkHttp
#1520#1338
. If this bug is impacting your applications,
please open an issue on
our quickstart
and
we will investigate potential fixes.
CLIENT-6246 Fixed bug on API 19 and below where the SDK would incorrectly surface a
REGISTRATION_ERROR_CODE/31301
exception for calls to
Voice.register(...)
or
Voice.unregister(...)
when a
EXCEPTION_INVALID_ACCESS_TOKEN/20101
actually occurred.
Known Issues
CLIENT-5075 The SDK cannot be added alongside the Programmable Video SDK.
CLIENT-4943 Restrictive networks may fail unless ICE servers are provided via
ConnectOptions.Builder.iceOptions(...)
or
AcceptOptions.Builder.iceOptions(...)
. ICE servers can be obtained from
Twilio Network Traversal Service
.
CLIENT-5242 Occasional native crash in
AsyncTask
of registration/unregistration and event publishing. The crash has only been observed on API 18 devices and results from a thread
safety bug in Android
. Similar crashes have been reported in the popular networking library OkHttp
#1520#1338
. If this bug is impacting your applications, please open an issue on
our quickstart
and we will investigate potential fixes.