三十一:基于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再见



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值