接着写聊天,今天写会议室。
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。