読者です 読者をやめる 読者になる 読者になる

A Day In The Life

とあるプログラマの備忘録

グループチャット追加画面の開発

androidm5

M5に対応したグループチャット追加画面の実装をします。

画面イメージは↓のような感じです。

グループチャット追加画面

友達一覧にチェックをつけれるようにしてグループチャットに招待したい友達を選択します。

Addボタンを押すとグループチャットが作成されコンタクトリストにグループチャットが追加されます。

Nicknameはグループチャット時に表示される自分のニックネームです。何も指定しない場合はメールアドレスが表示されます。

まずはメインのレイアウトからファイル名はgroup_chat_creater.xmlとします。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical">
  <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content">
    <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/nickname"/>
    <EditText android:id="@+id/nickname" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1"/>
  </LinearLayout>
  <ListView android:id="@id/android:list" android:layout_width="fill_parent" android:layout_height="wrap_content"/>
    <TextView android:id="@id/android:empty" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/no_contacts"/>
  <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content">
    <Button android:id="@+id/add" android:text="@string/button_add" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
    <Button android:id="@+id/close" android:text="@string/button_close" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
  </LinearLayout>
</LinearLayout>

次にリストの中身のレイアウトです。ファイル名はgroup_chat_contact.xmlとします。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent">
  <CheckBox android:id="@+id/check_contact" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
  <TextView android:id="@+id/nickname" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
</LinearLayout>

あとはアクティビティの実装です。

public class GroupChatCreater extends ListActivity implements View.OnClickListener {
  IGTalkSession gtalkSession = null;
  @Override
  protected void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.group_chat_creater);
    Button addButton = (Button) findViewById(R.id.add);
    addButton.setOnClickListener(this);
    Button closeButton = (Button) findViewById(R.id.close);
    closeButton.setOnClickListener(this);
    bindService((new Intent()
    	.setComponent(GTalkServiceConstants.GTALK_SERVICE_COMPONENT)), conn, 0);
  }
  private ServiceConnection conn = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder service) {
      try {
	gtalkSession = IGTalkService.Stub.asInterface(service).getDefaultSession();
      } catch (DeadObjectException e) {
        //
      }
    }
    public void onServiceDisconnected(ComponentName className) {
      gtalkSession = null;
    }
  };
  private void fillData() {
    Cursor cursor = Im.Contacts.query(getContentResolver(), null);
    this.setListAdapter(new SimpleCursorAdapter(this, R.layout.group_chat_contact, cursor,
      new String[] { ContactsColumns.NICKNAME },
      new int[] { R.id.nickname }));
  }
  @Override
  protected void onResume() {
    super.onResume();
    fillData();
  }
  @Override
  public void onClick(View view) {
    if (view.getId() == R.id.add) {
      int size = getListView().getCount();
      ArrayList&lt;String> contacts = new ArrayList&lt;String>();
      for (int i = 0; i &lt; size; i++) {
        View v = getListView().getChildAt(i);
        CheckBox check = (CheckBox)v.findViewById(R.id.check_contact);
        if (check.isChecked()) {
          TextView text = (TextView)v.findViewById(R.id.nickname);
          contacts.add(text.getText().toString());
        }
      }
      TextView nicknameText = (TextView)findViewById(R.id.nickname);
      try {
        gtalkSession.createGroupChatSession(
          nicknameText.getText().toString(), contacts.toArray(new String[] {}));
      } catch (DeadObjectException e) {
        //
      }
    }
    setResult(RESULT_OK);
    finish();
  }
}

こんな感じです。createGroupChatSessionメソッドを呼ぶことで新たにチャットセッションが作成されコンタクトリストにグループチャットが追加されます。

このときusenameはprivate-chat-00000000-0000-0000-0000-000000000000@groupchat.google.com(0のところは任意の数字)のようになります。



メッセージを送るにはまずコンタクトリスト(content://im/contacts)からusernameカラムを取得後

IChatSession chatSession = gtalkSession.getChatSession(usename);
chatSession.sendTextMessage("How are you?");

としてやるとメッセージを送れます。チャットセッションを取得する時にcreateChatSessionメソッドで新規セッションを作っちゃうとおかしな動きをするので注意してください。

グループチャットのメッセージ取得はcontent://im/messagesではなくcontent://im/groupMessagesから取得できます。



※ソースに一部間違いがありましたので修正しました(3月3日)。

関連