三十一:基於xmpp聊天會議室(1)

      接着寫聊天,今天寫會議室。


1、開啓服務,點擊Launch Admin進入分組聊天,點擊分組聊天設置進入會議服務,這裏有一個公共房間,當然你可以創建自己的服務,點擊左邊Create New Service,填寫:分組聊天服務名稱和Group chat service description (optional):保存屬性即可。




2、點擊房間管理員創建新房間,自己填一下保存更改即可,注意:密碼可填可不填,如果填寫了密碼,那麼在進入房間的時候就要輸入密碼。



3、接下來看一下Spark的會議室,點擊會議,首先進入的是會議服務。



4、雙擊服務進入會議房間,你就能看到剛纔創建的房間了,再雙擊某個房間,就進入聊天室了。



4、openfire和spark都看完了,從spark可知要進入聊天室,就要一層一層的進入,先獲取會議服務的JID,通過會議服務的JID來得到房間的JID,再通過房間的JID進入聊天室

5、那麼如何來獲取會議服務,其實很簡單,就幾行代碼,就可以獲取會議服務的JID、name等

/**
	 * get the chat service meeting list
	 */
	public static List<HostedRoom> getHostRooms() {
		if (getConnection() == null) {
			return null;
		}
		Collection<HostedRoom> hostrooms = null;
		List<HostedRoom> roominfos = new ArrayList<HostedRoom>();
		try {
			new ServiceDiscoveryManager(getConnection());
			hostrooms = MultiUserChat.getHostedRooms(getConnection(),
					getConnection().getServiceName());
			for (HostedRoom entry : hostrooms) {
				roominfos.add(entry);
				Log.i("HostRooms","serviceName:" + entry.getName() + "JID:" + entry.getJid());
			}
			Log.i("room", "serviceNum:" + roominfos.size());
		} catch (XMPPException e) {
			e.printStackTrace();
		}
		return roominfos;
	}
6、通過會議服務的JID獲取會議房間的JID,在此建議大家看一下官方文檔。

/**
	 * get the room list
	 * @param jid
	 * @return
	 */
	public static List<DiscoverItems.Item> getRooms(String jid) {
		List<DiscoverItems.Item> listDiscoverItems = new ArrayList<DiscoverItems.Item>();
		// Manages discovery of services in XMPP entities
		ServiceDiscoveryManager discoManager = ServiceDiscoveryManager
				.getInstanceFor(getConnection());
		//The official documentation:
		//A DiscoverItems IQ packet, which is used by XMPP clients to request and receive items associated with XMPP entities.
		//The items could also be queried in order to discover if they contain items inside. Some items may be addressable by its JID and others may require to be addressed by a JID and a node name.
		DiscoverItems discoItems;
		try {
			discoItems = discoManager.discoverItems(jid);
			Iterator it = discoItems.getItems();
			while (it.hasNext()) {
				DiscoverItems.Item item = (DiscoverItems.Item) it.next();
				Log.i("Room","roomName:" + item.getName() + "JID:" + item.getEntityID());
				listDiscoverItems.add(item);
			}
			return listDiscoverItems;
		} catch (XMPPException e) {
			e.printStackTrace();
		}
		return null;
	}

7、工具類已經完成,現在開始進入工程activit_hostroom.xml,一個button一個ListView不解釋:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <Button
        android:id="@+id/btn_createRoom"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:text="@string/createRoom" />

    <ListView
        android:id="@+id/lv_hostroom_rooms"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/btn_createRoom" >
    </ListView>

</RelativeLayout>
8、HostRoomActivity.java的代碼,有註釋:

package org.hkby.lwx.activity;

import java.util.ArrayList;
import java.util.List;

import org.hkby.lwx.adapter.AllRoomsAdapter;
import org.hkby.lwx.common.XmppTool;
import org.jivesoftware.smackx.packet.DiscoverItems;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListView;
/**
 * hostRoom
 * @author liaowuxing
 *
 */
public class HostRoomActivity extends Activity {
	private Button btn_createRoom;
	private ListView lv_rooms;
	private List<DiscoverItems.Item> listItems;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_hostroom);
		initView();
		initClick();
	}

	private void initView() {
		//create room
		btn_createRoom = (Button)this.findViewById(R.id.btn_createRoom);
		//show room
		lv_rooms = (ListView) this.findViewById(R.id.lv_hostroom_rooms);
		//save room
		listItems = new ArrayList<DiscoverItems.Item>();
		//get room
		listItems = XmppTool.getRooms("service JID");
		AllRoomsAdapter adapter = new AllRoomsAdapter(HostRoomActivity.this,
				listItems);
		lv_rooms.setAdapter(adapter);
	}

	private void initClick() {
		lv_rooms.setOnItemClickListener(new OnItemClickListener() {
			
			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				String jid = listItems.get(position).getEntityID();
				Intent intent = new Intent(HostRoomActivity.this,
						RoomChatActivity.class);
				intent.putExtra("jid", jid);
				startActivity(intent);
			}
		});
		btn_createRoom.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				//TODO
			}
		});
	}
}
9、AllRoomAdapter.java代碼:

package org.hkby.lwx.adapter;

import java.util.List;

import org.hkby.lwx.activity.R;
import org.jivesoftware.smackx.packet.DiscoverItems;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
/**
 * all room adapter
 * @author liaowuxing
 *
 */
public class AllRoomsAdapter extends BaseAdapter {
	private Context context;
	private List<DiscoverItems.Item> listItems;
	private LayoutInflater mInflater;

	public AllRoomsAdapter(Context context, List<DiscoverItems.Item> listItems) {
		this.context = context;
		this.listItems = listItems;
		mInflater = LayoutInflater.from(context);
	}

	@Override
	public int getCount() {
		return listItems.size();
	}

	@Override
	public Object getItem(int position) {
		return listItems.get(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		if (convertView == null) {
			ViewHolder viewHolder = new ViewHolder();
			convertView = mInflater.inflate(R.layout.room_item, null);
			viewHolder.tv_roomName = (TextView) convertView
					.findViewById(R.id.tv_roomName);
			convertView.setTag(viewHolder);
		}
		ViewHolder vHolder = (ViewHolder) convertView.getTag();
		String roomName = listItems.get(position).getName();
		if (roomName != null) {
			vHolder.tv_roomName.setText(roomName);
		} else {
			vHolder.tv_roomName.setText("");
		}
		return convertView;
	}

	private class ViewHolder {
		private TextView tv_roomName;
	}

}
10、room_item.xml代碼:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:padding="10sp"
        android:layout_marginLeft="10sp"
        android:src="@drawable/room_img" />

    <TextView
        android:id="@+id/tv_roomName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/imageView1"
        android:layout_marginBottom="14dp"
        android:layout_toRightOf="@+id/imageView1"
        android:textSize="16sp"
        android:textStyle="bold" />

</RelativeLayout>

11、看一下效果,是不是很醜,沒關係,功能實現就好,哈哈,不是美工不怕醜:



11、ok,先到這,有事,bye再見



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章