メニュー

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?

Android クイックスタート:着信通話を受ける

ここまでで、アプリケーションが発信の接続を開始する方法がわかりました。次に、着信の接続を見てみましょう。

着信の接続を受けるには、クライアントアプリケーションで次のことを行います。

  1. Device オブジェクトをクライアントの「名前」と共に登録する必要があります。
  2. アプリケーションが、リスナーメソッドで着信の接続を通知するコールバックを実装する必要があります。

クライアント名で登録する

Our app satisfies (1) by sending a client name to the server when it requests a token, as we've seen in previous steps. You can change the client name being sent to the server by clicking the button in the top right of the screen.

DeviceListener のコールバック

DeviceDeviceListener インターフェイスを実装しているオブジェクトに、重要なイベントを通知します。

public void onStartListening(Device inDevice);

  • Twilio へのデバイスの登録が成功した時のコールバックです。

public void onStopListening(Device inDevice);

  • 明示的なリクエストにより、デバイスが着信通話の待ち受けを停止した時のコールバックです。

public void onStopListening(Device inDevice, int inErrorCode, String inErrorMessage);

  • エラーにより、デバイスが着信通話の待ち受けを停止した時のコールバックです。

クイックスタートアプリケーションは、これらのコールバックを以下に実装します。 ClientActivity.java

ClientActivity.java
public class ClientActivity implements DeviceListener
{
    /* Device Listener */
    @Override
    public void onStartListening(Device device) {
        Log.d(TAG, "Device has started listening for incoming connections");
    }

    /* Device Listener */
    @Override
    public void onStopListening(Device device) {
        Log.d(TAG, "Device has stopped listening for incoming connections");
    }

    /* Device Listener */
    @Override
    public void onStopListening(Device device, int errorCode, String error) {
        Log.e(TAG, String.format("Device has encountered an error and has stopped" +
                " listening for incoming connections: %s", error));
    }
}

実際に着信の接続を受け入れるには、もう少し手間がかかります。

インテントを使用した着信接続の処理

着信の接続は、Twilio クライアントサービスによって検出され、アプリケーションに渡されます。フォアグラウンドであるのかバックグラウンドであるのかにかかわらず、着信接続をアプリケーションに通知する方法は、PendingIntent です。Device.setIncomingIntent() 経由で Twilio クライアント DevicePendingIntent を提供する必要があります。このオブジェクトは、着信の接続が受信されたときにトリガーされる Android コンポーネントを記述する Intent をラップします。 Twilio クライアントサービスは、次の Android コンポーネント、ActivityService、またはBroadcastRecieverには依存しません。

このインテントを受け取ったときに何を実行するのかは、インテントに設定したコンポーネントに応じて異なります。

インテントを受け取ると、Intent.getParcelableExtra() を使用し、さらにキーとして Device.EXTRA_DEVICEDevice.EXTRA_CONNECTION をそれぞれ使用することにより、 着信の接続のために DeviceConnection とを取得できます。

提案:使用している Device(s) を特定のアクティビティコンテキスト外にあるシングルトンオブジェクトに保持します。

次のコードスニペット(クイックスタートの修正バージョン)は、単一アクティビティアプリケーションでの着信接続の処理パターンを示しています。

public class ClientActivity implements DeviceListener, ConnectionListener {

    private void createDevice(String capabilityToken) {
          clientDevice = Twilio.createDevice(capabilityToken, ClientActivity.class);
          Intent intent = new Intent(getApplicationContext(), ClientActivity.class);
          PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
          clientDevice.setIncomingIntent(pendingIntent);
    }

    /*
     * Receive intent for incoming call from Twilio Client Service
     * Android will only call Activity.onNewIntent() if `android:launchMode` is set to `singleTop`.
     */
    @Override
    public void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
    }

    @Override
    public void onResume() {
        super.onResume();

        Intent intent = getIntent();

        if (intent != null) {
            /*
             * Determine if the receiving Intent has an extra for the incoming connection. If so,
             * remove it from the Intent to prevent handling it again next time the Activity is resumed
             */
            Device device = intent.getParcelableExtra(Device.EXTRA_DEVICE);
            Connection incomingConnection = intent.getParcelableExtra(Device.EXTRA_CONNECTION);

            if (incomingConnection == null && device == null) {
                return;
            }
            intent.removeExtra(Device.EXTRA_DEVICE);
            intent.removeExtra(Device.EXTRA_CONNECTION);

            // Application Specific Logic for handling an incoming Connection
            handleIncomingConnection(Device device, Connection incoming);
        }
    }


}

電話を受けるための Twilio 電話番号の設定

クイックスタートアプリケーションは、実際の電話機からの通話を受けることができます。ただし、まず、友人がこちらに電話をかけるための電話番号が必要です。そのためには、Twilio 電話番号をプロビジョニング (またはすでに購入してある Twilio 電話番号を使用)し、Voice URL を設定して Web サーバーの '/call' URL で再度ポイントするようにします。たとえば、次のとおりです。https://bosco-baracus-1201.herokuapp.com/call

The python server that we set up earlier is smart enough to determine that the incoming call is from a regular phone and should be routed to the Twilio Client name that you have hard-coded in server.py - it defaults to 'joey'.

自分の Twilio 番号に電話をかけると、自分のデバイス(または Android エミュレーター、いずれか実行している方)に電話がかかり、自動的に接続されるはずです。仲の良い友人とのチャットをお楽しみください。

まとめ

これでクイックスタートは終了です! アプリケーションのテレフォニーエクスペリエンスのカスタマイズ方法について知りたい場合は、TwiML ドキュメントTwilio クライアント Android のドキュメントを参照してください。

構築した結果が楽しみです。

Rate this page:

ヘルプが必要ですか?

We all do sometimes; code is hard. Get help now from our support team, or lean on the wisdom of the crowd browsing the Twilio tag on Stack Overflow.