Rate this page:

Thanks for rating this page!

We are always striving to improve our documentation quality, and your feedback is valuable to us. How could this documentation serve you better?


Incoming Calls and Registration for Push Notifications

How can my App receive calls?

To be able to receive incoming calls, you need to setup your push certificate in the Console and your app needs to register for incoming calls using Voice.register(...). Twilio will send you a push notification through FCM (Firebase Cloud Messaging Service) or GCM(Google Cloud Messaging Service). Check our quickstart implementation for how it is done.

Can the App receive incoming VoIP calls while it's not running or in the background?

Yes! See the FAQ “How can my App receive calls” to register for incoming calls. Once the app is registered, it will receive incoming call push notifications even when it’s in the background or not running.

How often should I register my device token?

The device token must be registered every time it changes or if the device has not received a push notification for 1 year. We recommend you implement the following logic:

  1. InvokeVoice.register(...) the first time the App is launched
  2. Store the device token and the current time. This is necessary to determine if the device token has changed.
  3. Implement “FirebaseMessagingService and check when the token is updated or invalidated via “onNewToken()” callback. Compare it to the token value stored in 2. If it has changed, invokeVoice.register(...) and store the new device token value.
  4. Check when [Voice.register(...) was last invoked. If it has been over 6 months, register the token again to not let it expire.

What's the difference between an Access Token and a Device Token?

An Access Token is required to access Twilio's services. A device token is a token that identifies the device to receive a push notification.

  • アクセストークンを供給するエンドポイントを作成しましたが、着信通話のプッシュ通知に対する登録に失敗し続けるのはなぜですか?
    • Twilioのアクセストークンは複数の製品の認証をサポートしますが、Programmable Voice SDKについては VoiceGrant を使用しているか確認してください。
    • アクセストークンの作成に不正なAPIキーとシークレットを使用していた可能性があります。 APIキーが作成されたらこれを外部に公開しないよう管理してください。 またアクセストークンを作成するにはAPIキーとシークレット両方を使用してください。
    • Twilioによって許可されている最大有効期限は24時間、すなわち86,400秒です。 有効期限が <= (86400 -1) となっていることを確認してください。
    • APIキーとシークレットがメインアカウントとサブアカウントとの間で共有可能になっていません。
    • アクセストークンの identity が空ではないことを確認してください。
  • SDKが登録成功を知らせているにも関わらず、着信通話のプッシュ通知が受信されないのはなぜですか?
    • Twilio Programmable Voice Android SDKが通話の着信を知らせるためにプッシュ通知を送信するには、FCM SECRET または FCM Server Key が必須です。 これらの値を使用してプッシュクレデンシャルを作成することが必要です。 アプリケーションで使用されている google-services.json に関連づけられている FCM SECRET または FCM Server Key が正しいものではない場合、通知は失敗します。
  • 同一の identity で10を超過するアクティブな登録がないか確認してください。 Twilioは直近の10の登録デバイスにのみ通知を行い、残りのデバイスでは通知は受信されません。
  • I was using the Android TwilioClient 1.2 SDK and just migrated to the Programmable Voice SDK. Why am I getting “Authentication error” using my Capability Token?
    • Programmable Voice SDKにおける認証には、Twilioアクセストークンと呼ばれる新しいトークン形式が必須です。 トークンを供給するエンドポイントでアプリケーションに対して Access Tokens を生成するよう更新してください。

Outbound Call

  • アクセストークンを使用していますが、通話を発信できないのはなぜですか?
    • アクセストークンで有効な Account SID 、有効な API signing key 、そして有効な secret を使用していることを確認してください。


My phone has been off for a while and when I turn it back on, I get calls that were already hung up

Note: This does not apply to version 2.1. The push notification sent to this version will expire within 30 seconds.

Twilio Voice SDKs use push notifications (APNS, FCM/GCM) as a mechanism to notify the callee of an incoming call. However, a problem presents itself when the callee‘s device is offline or not reachable: the push notification services cache the notification and re-attempt delivery at a much later time. The delayed notification may arrive after the call has already been terminated. The callee‘s device will briefly alert the user of a call that has already terminated leading to a poor user experience. Twilio plans to address this issue in a later release. However, in the meantime the following is a proposal for a work around you can implement to avoid the poor user experience.

The following 4 step proposal allows an app developer to use time information as an additional criteria to determine whether or not to display a call notification to the user.

Step 1 Generate a UTC based timestamp on the TwiML Application Server based on the Unix epoch in milliseconds.

var timeInMS = Date.now()

Step 2 Add this generated timestamp to the used to reach the callee

Parameters can be sent to a callee by initiating a TwiML . Use the attribute to specify your key/value parameters as shown below. The value shown below is an example of a timestamp obtained in step 1. You must pass the value as string. Pass the time as custom parameters in TwiML

<?xml version="1.0" encoding="UTF-8"?>
        <Dial answerOnBridge="false" callerId="client:alice">
                <Parameter name="timestamp" value="1555825985"  />

When the call invite push message arrives to the callee it will have the specified parameters.

Step 3 Get the timestamp from the bundle or message provided by FCM when it arrives to the Android application.

2.X SDKs

When receiving the push notification from Twilio, you can obtain the parameter from the bundle or message. The parameters are provided by FCM payload as the key: twi_params. The following shows how you can parse the contents of the data to get a map of the parameters you passed into the Dial. The “data” variable is the map provided by FCM.

Map<String, String> customParameters = new HashMap<>();
String query_pairs = data.get(“twi_params”);
if (query_pairs != null) {
    final String[] pairs = query_pairs.split("&");
    for (String pair : pairs) {
        final int idx = pair.indexOf("=");
        final String key;
        try {
            key = idx > 0 ? pair.substring(0, idx) : pair;
            final String value = idx > 0 && pair.length() > idx + 1 ? URLDecoder.decode(pair.substring(idx + 1).replaceAll("\\+", "%20"), "UTF-8") : null;
            customParameters.put(key, value);
        } catch (UnsupportedEncodingException e) {
3.X SDKs

When receiving the push notification from Twilio, you can obtain the parameter from CallInvite with the following:

Map<String, String> customParameters = callInvite.getCustomParameters();
String timestampString = customParameters.get(“timestamp”);

Step 4 Compare the UTC based timestamp to the UTC time on the device and discard the notification if the device time is significantly later than the timestamp generated by the server.

// Get the timestamp from the customParameters map and the current device time
String timestampString = customParameters.get(timestamp);
long timestamp = Long.parseLong(timestampString);
long currentTimestamp = System.currentTimeMillis();

// Compare the time difference
if (currentTimestamp > timestamp + 60000) {
  // discard notification...
} else {
  // display notification...


How to file a support ticket or create a GitHub issue

弊社ではご意見やご質問、ことにデバッグに役立つ情報の添えられたものを歓迎し、迅速に診断およびお答えします。 Issueやサポートチケットの送信時には、以下についてお知らせいただけると幸いです:

  • 説明 - 実現しようとしていること、再現手順、発生し散る事象。
  • SDKのバージョン
  • SDKのverbose log - 弊社チームがデバッグを行う上で、SDKログは常に最良の資料になります。 SDKのログレベルを構成するには、DEBUG: Voice.setLogLevel(LogLevel.DEBUG) と設定してください。
  • TwilioのアカウントSID
  • TwilioのCall SID


Voice SDK関連の一般的なご質問については、サポートチケットをお寄せください。

Rate this page:


誰しもが一度は考える「コーディングって難しい」。そんな時は、お問い合わせフォームから質問してください。 または、Stack Overflow でTwilioタグのついた情報から欲しいものを探してみましょう。