TwilioならLINEみたいな通話機能をカンタン実装できる!Androidアプリちょい足し開発レシピ(3)(3/4 ページ)

» 2013年08月02日 18時00分 公開
[諏訪悠紀アンダースコア]

認証・発信用のActivityの実装

 まずは、レイアウトの作成ですが、以下のウィジェットを配置します。

  • Twilioに登録するクライアント名を入力するためのEditText
  • Twilioアプリケーションサーバに接続する処理を実行するためのButton
  • 電話をかける相手のクライアント名を入力するためのEditText
  • 電話をかける(Twilioに接続する)処理を実行するためのButton

 以下のような画面レイアウトを作りましょう(レイアウトの作成方法は割愛します)。

図3 認証・発信用のActivityのレイアウト

 次にActivityを以下のように実装します。

  1. package jp.classmethod.android.sample.twiliophone;
  2. import android.os.Bundle;
  3. import android.support.v4.app.FragmentActivity;
  4. import android.support.v4.content.Loader;
  5. import android.util.Log;
  6. import android.view.View;
  7. import android.view.View.OnClickListener;
  8. import android.widget.EditText;
  9. import com.twilio.client.Device;
  10. import com.twilio.client.Twilio;
  11. public class MainActivity extends FragmentActivity
  12. implements OnClickListener, Twilio.InitListener {
  13. private static final String TAG = HelloTwilioActivity.class.getSimpleName();
  14. private Device mDevice;
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.activity_hello_twilio);
  19. // Connectボタン
  20. findViewById(R.id.connect).setOnClickListener(this);
  21. findViewById(R.id.dial).setOnClickListener(this);
  22. // Twilioクライアントを初期化する
  23. Twilio.initialize(getApplicationContext(), this);
  24. }
  25. /*
  26. * Twilio.InitListener method
  27. */
  28. @Override
  29. public void onInitialized() {
  30. Log.d(TAG, "Twilioクライアントの初期化が完了しました");
  31. }
  32. @Override
  33. public void onError(Exception e) {
  34. Log.e(TAG, "エラーが発生しました:" + e.getLocalizedMessage());
  35. }
  36. @Override
  37. public void onClick(View v) {
  38. switch (view.getId()) {
  39. case R.id.connect:
  40. // TwiMLアプリサーバに接続する処理
  41. break;
  42. case R.id.dial:
  43. // Twilioに接続する処理
  44. break;
  45. }
  46. }
  47. }

 Twilio.initializeメソッドで初期化するところなどは前回と同様です。Twilio.InitListenerのonInitialized()メソッドが呼び出されたらTwilio Client SDKが使える状態になります。Twilioアプリケーションサーバに接続する処理を実行するためのButton電話をかける(Twilioに接続する)処理を実行するためのButtonにOnClickListenerをセットし、onClickメソッドでそれぞれの処理が実行できるような形まで実装します。

 Deviceクラスを取得する非同期クラスを実装しましょう。AsyncTaskLoaderを継承した「DeviceLoader」クラスを新規作成し、以下のように実装します。

  1. package jp.classmethod.android.sample.twiliophone;
  2. import org.apache.http.HttpEntity;
  3. import org.apache.http.HttpResponse;
  4. import org.apache.http.client.HttpClient;
  5. import org.apache.http.client.methods.HttpGet;
  6. import org.apache.http.impl.client.DefaultHttpClient;
  7. import org.apache.http.util.EntityUtils;
  8. import android.app.PendingIntent;
  9. import android.content.Context;
  10. import android.content.Intent;
  11. import android.support.v4.content.AsyncTaskLoader;
  12. import android.util.Log;
  13. import com.twilio.client.Device;
  14. import com.twilio.client.Twilio;
  15. public class DeviceLoader extends AsyncTaskLoader<Device> {
  16. private static final String TAG = DeviceLoader.class.getSimpleName();
  17. private String mClientName;
  18. public DeviceLoader(Context context, String clientName) {
  19. super(context);
  20. mClientName = clientName;
  21. }
  22. @Override
  23. public Device loadInBackground() {
  24. try {
  25. // ケイパビリティトークンを取得する
  26. String url = "http://YOUR-APP-NAME.herokuapp.com/auth?name=" + mClientName;
  27. HttpClient httpClient = new DefaultHttpClient();
  28. HttpGet get = new HttpGet(url);
  29. HttpResponse res = httpClient.execute(get);
  30. HttpEntity entity = res.getEntity();
  31. String token = EntityUtils.toString(entity);
  32. Log.d(TAG, "トークン:" + token);
  33. // Twilioにデバイスを登録する
  34. Device device = Twilio.createDevice(token, null);
  35. // 着信を受けるためのIntentを生成してセットする
  36. Intent intent = new Intent(getContext(), IncomingActivity.class);
  37. PendingIntent pendingIntent = PendingIntent.getActivity(getContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
  38. device.setIncomingIntent(pendingIntent);
  39. return device;
  40. } catch (Exception e) {
  41. Log.e(TAG, "エラー:" + e.getLocalizedMessage());
  42. }
  43. return null;
  44. }
  45. }

 Deviceクラスを取得するにはケイパビリティトークンが必要ですので、TwiMLアプリサーバで作成した認証用APIを呼び出し、取得します。このときリクエストパラメータにクライアント名を渡す必要がありますが、EditTextで入力されたクライアント名が受け取れるよう、コンストラクタ引数に追加しておきます。

 Twilio.createDevice()メソッドを呼び出し、Deviceインスタンスを取得します。引数には認証用APIから取得したケイパビリティトークンを渡します。このDeviceインスタンスを使ってTwilioに接続(電話の発信)することになります。

 DeviceインスタンスのsetIncomingIntent()メソッドを使って、着信があったときに呼び出されるPendingIntentをセットします。PendingIntentから呼び出されるActivityはIncomingActivityをセットしていますが、このクラスは後で実装します。

 以上でDeviceLoaderクラスの実装が終わりました。

 続いて、MainActivityの実装に戻り、接続用のボタンと発信用のボタンをタップしたときの処理を実装しましょう。

  1. @Override
  2. public void onClick(View view) {
  3. switch (view.getId()) {
  4. // Twilioに登録する
  5. case R.id.connect:
  6. // 入力されたクライアント名をパラメータに設定する
  7. EditText clientName = (EditText) findViewById(R.id.client_name);
  8. Bundle bundle = new Bundle();
  9. bundle.putString("name", clientName.getText().toString());
  10. // TwilioPhoneLoaderを呼び出す
  11. getSupportLoaderManager().initLoader(TWILIO_PHONE_LOADER, bundle, this);
  12. break;
  13. }
  14. // 電話をかける
  15. case R.id.dial:
  16. // 入力されたクライアント名をパラメータに設定する
  17. EditText to = (EditText) findViewById(R.id.dial_name);
  18. HashMap<String, String> params = new HashMap<String, String>();
  19. params.put("name", to.getText().toString());
  20. // 電話をかける
  21. mDevice.connect(params, null);
  22. break;
  23. }
  24. }
  25. /*
  26. * LoaderCallbacks method
  27. */
  28. @Override
  29. public Loader<Device> onCreateLoader(int id, Bundle bundle) {
  30. DeviceLoader loader = new DeviceLoader(getApplicationContext(), bundle.getString("name"));
  31. loader.forceLoad();
  32. return loader;
  33. }
  34. @Override
  35. public void onLoadFinished(Loader<Device> loader, Device device) {
  36. Log.d(TAG, "デバイスの準備が完了しました");
  37. mDevice = device;
  38. getSupportLoaderManager().destroyLoader(TWILIO_PHONE_LOADER);
  39. }
  40. @Override
  41. public void onLoaderReset(Loader<Device> loader) {
  42. }

 接続用ボタン(ここでは「connect」というIDのボタン)をタップしたときは、DeviceLoaderを呼び出すように実装します。DeviceLoaderのコールバックを受け取るためにLoaderCallbacksを実装し、onCreateLoader()でDeviceLoaderをインスタンス化し、非同期処理を実行します。onLoadFinished()でDeviceインスタンスを受け取り、メンバ変数として保持します。

 発信用ボタン(ここでは「dial」というIDのボタン)をタップしたときは、Deviceインスタンスのconnect()メソッドを呼び出し、Twilioに接続します。ここでTwilioに接続することで、Twilio側ではTwiMLアプリのTwiMLを返すAPIを呼び出し、TwiMLに記載された命令を実行してくれます。第1引数に渡しているHashMapインスタンスはリクエストパラメータです。TwiMLを返すAPIを呼び出すときのリクエストパラメータとして使われます。

 以上でTwilioに認証しDeviceインスタンスを受け取る処理、そしてDeviceインスタンスを使ってTwilioに接続する処理の実装が終わりました。

Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

Smart & Social 鬮ォ�ェ陋滂ソス�ス�コ闕オ譁溷クキ�ケ譎「�ス�ウ驛「�ァ�ス�ュ驛「譎「�ス�ウ驛「�ァ�ス�ー

髫エ蟷「�ス�ャ髫エ魃会スス�・髫エ蟶キ�」�ッ闖ォ�」

注目のテーマ

4AI by @IT - AIを作り、動かし、守り、生かす
Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。