Android × Twilio #1 サーバーから音声通話を受信してみよう

2013.04.26

Twilio Client SDK for Android

弊社ブログ内ですでにいくつか取り上げられている Twilio ですが、今回は Twilio Client SDK for Android を触ってみました。 Twilio を使うと Android アプリに超簡単に電話機能を付けることができます!これは魅力的ですね!
ということで Twilio Client SDK for Android を使って簡単なサンプルアプリを作ってみたいと思います。こちらの公式ドキュメントも合わせて読んで進めていきましょう。

用意するもの

  • Twilio アカウント (無料から始められます)
  • Android アプリ開発環境 (ADT Bundle とか)
  • Twilio Client SDK for Android
  • Android 端末 (OSバージョン 2.2 以上)

1. サーバーの構築

まずはサーバーを適当に作ります。今回はサンプルにしたがって PHP で作ります。以下の 2 つの API が必要です。この API は Twilio から見える必要があるので EC2 などで適当に作ります。

  • Capality Token 取得 API (認証API)
  • TwiML を返す API

auth.php

<?php

// Found in the 'helper-libs' folder, or download twilio-php from http://twilio.com/docs/libraries
require "Services/Twilio/Capability.php";

$accountSid = "アカウントのSID"; 
$authToken = "アカウントの認証トークン";

// The app outgoing connections will use:
$appSid = "TwilioアプリのSID"; 

// The client name for incoming connections:
$clientName = "monkey"; 

$capability = new Services_Twilio_Capability($accountSid, $authToken);

// This would allow incoming connections as $clientName: 
$capability->allowClientIncoming($clientName);

// This allows outgoing connections to $appSid with the "From" parameter being $clientName 
$capability->allowClientOutgoing($appSid, array(), $clientName);

// This would return a token to use with Twilio based on 
// the account and capabilities defined above 
$token = $capability->generateToken(3600);

echo $token;
?>

$appSid は後述するアプリ登録のときに生成されるので、いまはまだ入力しなくて良いです。

hello.php

<?php
header('Content-type: text/xml');
?>
<Response>
    <Say language="ja-jp" voice="woman">こんにちは。クラスメソッド株式会社です。</Say>
</Response>

hello.php は TwiML を返す API です。TwiML の Say タグ内に入れた文字列が読み上げられます。TwiML の書きかたについてはこちらを参照しましょう。

2. アプリの登録

まずは Twilio サービスに登録する必要があります。以下の記事を参考にユーザ登録しましょう。

クラウド電話API 「Twilio」を使ってみよう#1 | Developers.IO

そして次に Twilio アプリを登録します。「ツール」タブを選び、その下のサブメニューから「TwiML App」を選びます。そして「TwiMLAppを作成する」をクリックします。

twilio_app01

フォーム内の「フレンドリーネーム」にはアプリ名(好きな名前でOK)、音声通話欄の「Request URL」には先ほど作った hello.php の URL を入力します。メソッドはデフォルトで POST になっているので、今回は GET に変更してください。

twilio_app02

ここまでできたら「変更を保存する」をクリックします。するとアプリ情報に「SID」というのができているのでこれをコピーして auth.php$appSid にペーストします。

twilio_app03

auth.phphello.php をサーバーにアップして、Twilio サーバーの準備は完了です!

3. Twilio Client アプリの実装

次にいよいよ Twilio Client アプリを作ります!今回はサンプルにある「MonkeyPhone」というサンプルを動かしてみましょう。MonkeyPhone のサンプルプロジェクトはダウンロード済みの SDK フォルダ内の quickstart/HelloMonkey フォルダにあるのでインポートして進めてください。

要点を解説したいと思います。まずは MonkeyPhone クラスです。このクラスは Twilio SDK のセットアップと Twilio アプリサーバーへのコネクション(トークンを取得してデバイスとして登録) を処理するクラスです。まずは Twilio#initialize() メソッドを呼びます。

public MonkeyPhone(Context context) {
    Twilio.initialize(context, this);
}

第二引数は Twilio.InitListener です。初期化処理が完了したら onInitialized() が呼ばれます。そのあとは auth.php を呼び出し Twilio アプリサーバーから CapapilityToken を取得します。そして Twilio#createDevice() メソッドの第一引数に取得したトークンを渡します。すると Twilio アプリサーバーに対してデバイス登録でき Device オブジェクトが取得できます。

@Override
public void onInitialized() {
    Log.d(TAG, "Twilio SDK is ready");
    try {
        // トークンの取得
        String capabilityToken = HttpHelper.httpGet(AUTH_URL);
        Log.d(TAG, "capabilityToken:" + capabilityToken);
        // デバイス登録
        device = Twilio.createDevice(capabilityToken, this);
    } catch (Exception e) {
        Log.e(TAG, "Failed to obtain capability token: " + e.getLocalizedMessage());
    }
}

あとはこの Device オブジェクトの connect() メソッドを呼ぶと hello.php で返している TwiML を読み上げてくれます!!読み上げが終わると自動で切断されますし disconnect() を呼んで切断することもできます。

// 接続
public void connect() {
    connection = device.connect(null, this);
    if (connection == null) {
        Log.w(TAG, "Failed to create new connection");
    }
}

要点は大体こんな感じです。
これで完成!…と思ったのですが、サンプルだとメインスレッドで通信処理をやっているので、そのままだと Android 4.0 以降だと動作しません。。。
ということで Support Package を入れて AsyncTaskLoader で MonkeyPhone オブジェクトを生成する処理を実装するようにしましょう。AsyncTaskLoader の使いかたはこちらを参考にしてください。

package com.twilio.example.hellomonkey;

import android.content.Context;
import android.support.v4.content.AsyncTaskLoader;

public class MonkeyPhoneLoader extends AsyncTaskLoader<MonkeyPhone> {

    public MonkeyPhoneLoader(Context context) {
        super(context);
    }

    @Override
    public MonkeyPhone loadInBackground() {
        MonkeyPhone phone = new MonkeyPhone(getContext());
        return phone;
    }
    
}

あとは Activity などで任意のタイミングで connect() メソッドを呼び出すようにして完成です!実行すると hello.php の内容を読み上げてくれると思います!

twilio_app04

まとめ

短いコードで呼び出せるので、とても簡単に実装することができました。 アイデア次第では面白いアプリが作れそうな感じが沸々としてきますね。まずは一度触れてみてください。

参考