Android x Twilio #5 アプリ同士で通話してみよう

2013.05.21

はじめに

いままで QuickStart を追って試してきましたが、今回は QuickStart のラスト、「アプリからアプリに電話をかけ、通話する」サンプルを作成したいと思います。今まではアプリから一般電話だったり、一般電話との通話でしたが、今回でついにアプリ内で完結できる通話機能を実装できます。なお2つの端末が必要になりますが、今回はエミュレータと実機を使って試してみます。
また、これまでのソースに付け加える形で実装するので、第1回〜第4回を実装している前提で進めていきます。

クライアント名を決められるようにする

まずは MonkeyPhone クラスを修正します。第4回では認証APIにクライアント名を渡す実装をしましたが、ここをエミュレータと実機で名前を変えるように実装します。onInitialized() メソッドを以下のように修正しましょう。

@Override
public void onInitialized() {
    Log.d(TAG, "Twilio SDK is ready");
    try {
        // エミュレータかどうかを判別する
        boolean isEmulator = TextUtils.equals(Build.PRODUCT, "sdk") || TextUtils.equals(Build.PRODUCT, "google_sdk");
        String clientName = isEmulator ? "class" : "method";
        // パラメータを付ける
        String request = AUTH_URL + "?client=" + clientName;
        String capabilityToken = HttpHelper.httpGet(request);
        Log.d(TAG, "capabilityToken:" + capabilityToken);
        mDevice = Twilio.createDevice(capabilityToken, this /* DeviceListener */);
        // 着信を受けるためのIntentを生成してセットする
        Intent intent = new Intent(mContext, HelloMonkeyActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        mDevice.setIncomingIntent(pendingIntent);
    } catch (Exception e) {
        Log.e(TAG, "Failed to obtain capability token: " + e.getLocalizedMessage());
    }
}

Build.PRODUCT でエミュレータかどうかを判別できます。これで class か method というクライアント名の Capability Token を取得出来ます。

クライアント名で電話がかけられるようにする

次にサーバーサイドの実装です。CallController クラスを以下のように修正します。

# coding:utf-8
class CallController < ApplicationController
  # GET "/call"
  def index
    # TwiMLを生成
    response = Twilio::TwiML::Response.new do |r|
      number = params[:PhoneNumber]
      r.Dial :callerId => 'Twilioでベリファイ済みの電話番号' do |d|
        # 電話番号かどうか判別する
        if /^[\d\(\)\-\+ ]+$/ =~ number
          d.Number number
        else
          d.Client number
        end
      end
    end
    # XMLで出力
    render :xml => response.text
  end
end

パラメータには電話番号とクライアント名をどちらも入力できるようにしています(正規表現で電話番号かどうかを判定)。Number タグを使うと電話番号に対する発信、Client タグを使うとクライアント名に対応する端末(アプリ)に対する発信になります。
以下のコマンドでデプロイして完了です。

cd ~/hello-twilio
git add .
git commit -m 'CallControllerをClientを指定できるように修正'
git push heroku master

TwiML App の設定の変更も忘れずにしておいてください。

twilio_app01

通話してみる

それではアプリを動かしてみましょう!エミュレータから実機に対して通話してみます。エミュレータで音声を聞く必要がありますが、音声が聞こえない場合は Eclipse の環境設定の Android > Launch の Default emulator options--useaudio を追加することで設定できます。

twilio_app02

ではエミュレータと実機、それぞれにアプリをインストールし、エミュレータ側のアプリのテキストインプットに device と入力して「Dial」ボタンをタップします。

twilio_app03

これで実機側に着信が入り、エミュレータと実機で通話できるはずです!一人だとめっちゃ寂しいので注意してください!

まとめ

今回までで QuickStart の手順をひと通り試しました。Twilio を使ってアプリに通話機能を入れたい場合はこのサンプルだけで十分な実装ができていると思います。
Twilio を上手く活用することで、インパクトあるアプリを作ることができると思います。今後は QuickStart から発展させ、いろいろな機能を作っていきたいと思います。

参考