ホーム 開発支援情報 技術ブログ 使ってみようAPI講座 【使ってみようAPI講座】Lesson3 : 雑談対話API(前編)

使ってみようAPI講座

【使ってみようAPI講座】Lesson3 : 雑談対話API(前編)

掲載日:2015年04月16日

ドコモAPIを実際に使いながらご紹介する「使ってみようAPI講座」。Lesson3では雑談対話APIを例に、コンピュータと自然な会話を行うためのAndroidアプリ作ります。

雑談対話API

ユーザの会話を受け、その入力に対して自然な会話となる返事を提供するAPIです。このAPIを使うと、ユーザのどんな発話に対しても必ず返事を返しますので、コンピュータ相手にたわいもない雑談をすることができます。

雑談対話APIのSDK

雑談対話APIでは、ユーザからのリクエストおよびコンピュータからのレスポンスをJSONで返します。そのため、JSONデータを扱うためのオープンソースライブラリである、Jacksonライブラリが含まれています。Androidアプリで、雑談対話APIを利用するときはAndoridプロジェクトのlibsフォルダ内にこの5つのjarファイルをコピーしてください。SDKにはサンプルコードも同梱されています。

雑談対話APIを使ったコンピュータとのチャットアプリ

雑談対話APIを使って、ユーザとコンピュータで雑談するアプリを作成します。まず、Eclipseを起動し、新規でAndroidプロジェクトを作成します。プロジェクト名は「BotChat」とし、エントリポイントとなるアクティビティをMainActivity.java、レイアウトファイルをactivity_main.xmlとして作成します。

サンプルファイルのダウンロード

画面の作成(ListViewとカスタムレイアウト作成)

最初にアプリケーションのUIを作成します。ユーザとコンピュータでの会話を交互に表示するため、ListViewコントロールを使います。ListViewコントロールは、複数のアイテムを1つにまとめてリスト形式で表示することができるビューです。

まず、プロジェクトで作成したactivity_main.xmlのレイアウトに対話内容を表示するためのListViewコントロールと、対話内容を送信するためのEditTextコントロールとButtonコントロールを配置します。

ListViewコントロールは、あらかじめいくつかのレイアウトが用意されていますが、今回は、ユーザとコンピュータの会話を異なるレイアウトで表示したいので、カスタムレイアウトを作成します。

ListViewコントロールに表示するレイアウト作成

ListViewコントロールに表示するレイアウト作成

まず、ユーザの会話を表示するためのレイアウトをcomment_list_right.xmlとして作成し、LinearLayoutコントロール内にTextViewコントロールとImageViewコントロールを水平方向に配置します。

同様に、画像とテキストビューを水平配置した、コンピュータからの返答を表示するためのレイアウトをcomment_list_left.xmlとして作成します。コードの詳細については、Androidプロジェクトのres/layout配下のサンプルを確認してください。

会話データの保持クラス作成

次に、カスタムレイアウト内で表示するデータを保持するためクラスであるCommentItem.javaを作成します。CommentItem.javaでは、コメントのテキストデータを保持するString型のフィールドと、表示する画像のリソースIDを保持するint型フィールドと表示するレイアウトのリソースIDを保持するint型フィールドをもたせます。これを他クラスから利用するため、各フィールドのアクセサメソッドを実装します。

Adapterクラスの作成

これで、画面(XMLレイアウト)の作成とデータ保持クラス(CommentItem.java)ができましたので、これらの橋渡しをするためのAdapterクラスを作成します。Adapterクラスを使うことで、データソースである雑談対話APIからの返答データと画面のデザインを分離することができます。

Adapterクラス

Adapterクラス

Adapterは、ListViewコントロールだけでなく、AdapterViewから派生したViewで使えます。今回は、ユーザとコンピュータの会話を異なるレイアウトで交互に表示させたいので、ArrayAdapterを継承した独自のAdapterクラス(CommentAdapter.java)作成します。

public class CommentAdapter extends ArrayAdapter<CommentItem> {
   
~中略~
   
@Override
   
public View getView(int pos, View convertView, ViewGroup parent) {
       
       
CommentItem item = (CommentItem) getItem(pos);
       
ViewHolder holder;
       
       
// 1. Viewの再利用
       
if ( convertView == null || convertView.getId() != item.getLayoutType()) {
            convertView
= inflater
                   
.inflate(item.getLayoutType(), parent, false);
            holder
= new ViewHolder(convertView);
            convertView
.setTag(holder);
       
} else {
           
// すでにViewがあればそれを使いまわす
            holder
= (ViewHolder) convertView.getTag();
       
}
       
// ビューにアイコンとコメントをセットする
        holder
.icon.setImageResource(item.getImgtype());
        holder
.text.setText(item.getText());
       
return convertView;
   
}
   
// 2.ビューを保持するためのメンバークラス
   
private static class ViewHolder {
       
TextView text;
       
ImageView icon;
       
private ViewHolder(View view) {
           
this.text = (TextView) view.findViewById(R.id.comment);
           
this.icon = (ImageView) view.findViewById(R.id.image);
       
}
   
}
}

リスト1 アダプタクラスの作成(CommentAdapter.javaの抜粋)

getViewメソッドは、新しいデータが表示されるタイミングで呼び出されます。ListViewではスクロールして、画面外から新しいデータが表示されるタイミングです。1の箇所でパフォーマンスの観点からgetViewメソッド内でViewを再利用しています。

次回の雑談対話API後半では、リクエストからdocomoIDと連係したパーソナライズ機能への応用まで説明していきます。引き続きお楽しみください。

雑談対話API(後編)へ

原著 : 阿佐 志保

お問い合わせ
「docomo Developer support」及び「作ろうスマートフォン/iモードコンテンツ」に関するお問い合わせです。よくあるご質問や技術ブログで解決しない場合は、お問い合わせください。