このクラスを呼び出すタイミングはActivityに実装したonInitialized()メソッドの中です。またDeviceLoaderはAsyncTaskLoaderを使っているので、ActivityにLoaderCallbacks<Device>を実装し、以下の処理を追加しましょう。
private static final int TWILIO_PHONE_LOADER = 0; @Override public void onInitialized() { Log.d(TAG, "Twilioクライアントの初期化が完了しました"); // TwilioPhoneLoaderを呼び出す getSupportLoaderManager().initLoader(TWILIO_PHONE_LOADER, null, this); } @Override public Loader<Device> onCreateLoader(int id, Bundle bundle) { DeviceLoader loader = new DeviceLoader(getApplicationContext()); loader.forceLoad(); return loader; } @Override public void onLoadFinished(Loader<Device> loader, Device device) { Log.d(TAG, "デバイスの準備が完了しました"); mDevice = device; getSupportLoaderManager().destroyLoader(TWILIO_PHONE_LOADER); } @Override public void onLoaderReset(Loader<Device> loader) { }
これでDeviceインスタンスを非同期で取得し、Activityにメンバ変数として保持できるようになりました。
次に、ボタンを押したときの処理を実装します。onClick()メソッドに以下の処理を追加しましょう。
@Override public void onClick(View v) { if (mDevice != null) { // 入力されたメッセージをパラメータに渡し、接続する EditText editText = (EditText) findViewById(R.id.edit_text); String message = editText.getText().toString(); HashMap<String, String> params = new HashMap<String, String>(); params.put("message", message); mDevice.connect(params, null); } else { Log.e(TAG, "デバイスがありません"); } }
アプリから電話を発信したい場合、Device.connect()メソッドを呼びます。第1引数には渡したいパラメータをHashMap<String, String>でセットします。今回はEditTextで入力された値をmessageというパラメータで渡したいので、HashMapに格納して渡しています。
また第2引数には、ConnectionListenerを渡しますが、今回は使わないのでnullを渡しておきます。
以上で実装完了です。ActivityではonCreate()メソッド内でTwilioPhoneLoaderを呼び出し、取得したTwilioPhoneインスタンスを保持しておきます。ボタンをタップするとTwilioPhone.connect()が呼び出され、Twilioに接続します。
Twilioはアプリ用サーバのTwiMLを取得し、設定したメッセージを音声で読み上げてくれます。
それでは、実際に動作させてみましょう。アプリを起動し、Connectボタンをタップしてください。入力した内容を自動音声で読み上げてくれるはずです。
今回はTwilioサービスを使って音声を読み上げるアプリを実装しました。次回はさらに発展させ、LINEやcomm、カカオトークみたいにアプリ同士で通話する機能を実装したいと思います。
諏訪悠紀
クラスメソッド株式会社に勤務するAndroidプログラマです。UI・UXデザインもとても興味があり、業務で担当することもあります。最近ではObjective-Cも触り始めました。
Copyright © ITmedia, Inc. All Rights Reserved.