您的位置:首页 > 移动开发 > Android开发

Android基于XMPP Smack Openfire下学习开发IM(三)会议室创建、加入以及查询会议室中所有成员等

2014-04-23 16:06 405 查看
openfire 中的会议室不像QQ群一样,不能保存那些离线用户,加入会议室后,一旦断开连接,就会离开会议室。

虽然如此,但如果要实现也不是不可能,我们可以自己做后台来保存,有兴趣的可以去试着实现一下,这里就不实现了。

好了,下面我们就一起来学习一下创建会议室、加入会议室以及查询会议室中的所有成员:

一、创建会议室

注释都写的很清楚,不做太多解释。

需要配置更多信息,可以到 http://xmpp.org/extensions/xep-0045.html 中15.5.3 muc#roomconfig FORM_TYPE 查看配置

里面还有一些关于会议室的信息,感兴趣的可以看看,不过里面都是英文,不懂英文的可以谷歌翻译,楼主就是这么干的~

/**
	 * 创建房间
	 * 
	 * @param roomName 房间名称
	 */
	public static void createRoom(String roomName) {
		if (connection == null) {
			return;
		}
		try {
			// 创建一个MultiUserChat
			MultiUserChat muc = new MultiUserChat(connection, roomName
					+ "@conference." + connection.getServiceName());
			// 创建聊天室
			muc.create(roomName); // roomName房间的名字
			// 获得聊天室的配置表单
			Form form = muc.getConfigurationForm();
			// 根据原始表单创建一个要提交的新表单。
			Form submitForm = form.createAnswerForm();
			// 向要提交的表单添加默认答复
			for (Iterator<FormField> fields = form.getFields(); fields
					.hasNext();) {
				FormField field = (FormField) fields.next();
				if (!FormField.TYPE_HIDDEN.equals(field.getType())
						&& field.getVariable() != null) {
					// 设置默认值作为答复
					submitForm.setDefaultAnswer(field.getVariable());
				}
			}
			// 设置聊天室的新拥有者
			List<String> owners = new ArrayList<String>();
			owners.add(connection.getUser());// 用户JID
			submitForm.setAnswer("muc#roomconfig_roomowners", owners);
			// 设置聊天室是持久聊天室,即将要被保存下来
			submitForm.setAnswer("muc#roomconfig_persistentroom", false);
			// 房间仅对成员开放
			submitForm.setAnswer("muc#roomconfig_membersonly", false);
			// 允许占有者邀请其他人
			submitForm.setAnswer("muc#roomconfig_allowinvites", true);
			// 进入是否需要密码
			//submitForm.setAnswer("muc#roomconfig_passwordprotectedroom", true);
			// 设置进入密码
			//submitForm.setAnswer("muc#roomconfig_roomsecret", "password");
			// 能够发现占有者真实 JID 的角色
			// submitForm.setAnswer("muc#roomconfig_whois", "anyone");
			// 登录房间对话
			submitForm.setAnswer("muc#roomconfig_enablelogging", true);
			// 仅允许注册的昵称登录
			submitForm.setAnswer("x-muc#roomconfig_reservednick", true);
			// 允许使用者修改昵称
			submitForm.setAnswer("x-muc#roomconfig_canchangenick", false);
			// 允许用户注册房间
			submitForm.setAnswer("x-muc#roomconfig_registration", false);
		    // 发送已完成的表单(有默认值)到服务器来配置聊天室
		    submitForm.setAnswer("muc#roomconfig_passwordprotectedroom", true);		    
			// 发送已完成的表单(有默认值)到服务器来配置聊天室
			muc.sendConfigurationForm(submitForm);
		} catch (XMPPException e) {
			e.printStackTrace();
		}
	}


二、加入会议室

/**
	 * 加入会议室
	 * 
	 * @param user 昵称
	 * @param password 会议室密码
	 * @param roomsName 会议室名
	 * @param connection 
	 */
	public static MultiUserChat joinMultiUserChat(String user, String password, String roomsName,
			XMPPConnection connection) {
		try {
			// 使用XMPPConnection创建一个MultiUserChat窗口
			MultiUserChat muc = new MultiUserChat(connection, roomsName
					+ "@conference." + connection.getServiceName());
			// 聊天室服务将会决定要接受的历史记录数量
			DiscussionHistory history = new DiscussionHistory();
		        history.setMaxStanzas(0);
                        //history.setSince(new Date());
			// 用户加入聊天室
		        muc.join(user, password, history, SmackConfiguration.getPacketReplyTimeout());
			System.out.println("会议室加入成功........");
			return muc;
		} catch (XMPPException e) {
			e.printStackTrace();
			System.out.println("会议室加入失败........");
			return null;
		}
	}


三、查询会议室中的所有成员

注意:这里查询出来的名字只是用户进入会议室所用的昵称
/**
	 * 查询会议室成员名字
	 * @param muc
	 */
	public static List<String> findMulitUser(MultiUserChat muc){
		List<String> listUser = new ArrayList<String>();
		Iterator<String> it = muc.getOccupants();
		//遍历出聊天室人员名称
		while (it.hasNext()) {
			// 聊天室成员名字
			String name = StringUtils.parseResource(it.next());
			listUser.add(name);
		}
		return listUser;
	}


四、获取服务器上所有会议室

/**
	 * 获取服务器上所有会议室
	 * @return
	 * @throws XMPPException
	 */
	public static List<FriendRooms> getConferenceRoom() throws XMPPException {
		List<FriendRooms> list = new ArrayList<FriendRooms>();
		new ServiceDiscoveryManager(connection);
		if (!MultiUserChat.getHostedRooms(connection,
				connection.getServiceName()).isEmpty()) {

			for (HostedRoom k : MultiUserChat.getHostedRooms(connection,
					connection.getServiceName())) {

				for (HostedRoom j : MultiUserChat.getHostedRooms(connection,
						k.getJid())) {
					RoomInfo info2 = MultiUserChat.getRoomInfo(connection,
							j.getJid());
					if (j.getJid().indexOf("@") > 0) {

						FriendRooms friendrooms = new FriendRooms();
						friendrooms.setName(j.getName());//聊天室的名称
						friendrooms.setJid(j.getJid());//聊天室JID
						friendrooms.setOccupants(info2.getOccupantsCount());//聊天室中占有者数量
						friendrooms.setDescription(info2.getDescription());//聊天室的描述
						friendrooms.setSubject(info2.getSubject());//聊天室的主题
						list.add(friendrooms);
					}
				}
			}
		}
		return list;
	}


五、监听会议室的消息

添加会议室消息监听 :
multiChat.addMessageListener(new multiListener());


/**
	 * 會議室信息監聽事件
	 * 
	 * @author Administrator
	 * 
	 */
	public class multiListener implements PacketListener {
		@Override
		public void processPacket(Packet packet) {
			Message message = (Message) packet;
			// 接收来自聊天室的聊天信息
			String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
			MucHistory mh = new MucHistory();
			mh.setUserAccount(account);
			String from = StringUtils.parseResource(message.getFrom());
			String fromRoomName = StringUtils.parseName(message.getFrom());
			mh.setMhRoomName(fromRoomName);
			mh.setFriendAccount(from);
			mh.setMhInfo(message.getBody());
			mh.setMhTime(time);
			mh.setMhType("left");

		}
	}


六、发送会议室消息

<strong>multiChat.sendMessage(str);//multiChat </strong>为聊天室对象


七、监听会议室状态(成员的进入、离开等)

添加监听事件:
multiChat.addParticipantStatusListener(new ParticipantStatus());


会议室状态监听事件:

/**
	 * 会议室状态监听事件
	 * 
	 * @author Administrator
	 * 
	 */
	class ParticipantStatus implements ParticipantStatusListener {

		@Override
		public void adminGranted(String arg0) {
			// TODO Auto-generated method stub

		}

		@Override
		public void adminRevoked(String arg0) {
			// TODO Auto-generated method stub

		}

		@Override
		public void banned(String arg0, String arg1, String arg2) {
			// TODO Auto-generated method stub

		}

		@Override
		public void joined(String participant) {
			System.out.println(StringUtils.parseResource(participant)+ " has joined the room.");
		}

		@Override
		public void kicked(String arg0, String arg1, String arg2) {
			// TODO Auto-generated method stub

		}

		@Override
		public void left(String participant) {
			// TODO Auto-generated method stub
			System.out.println(StringUtils.parseResource(participant)+ " has left the room.");
			
		}

		@Override
		public void membershipGranted(String arg0) {
			// TODO Auto-generated method stub

		}

		@Override
		public void membershipRevoked(String arg0) {
			// TODO Auto-generated method stub

		}

		@Override
		public void moderatorGranted(String arg0) {
			// TODO Auto-generated method stub

		}

		@Override
		public void moderatorRevoked(String arg0) {
			// TODO Auto-generated method stub

		}

		@Override
		public void nicknameChanged(String participant, String newNickname) {
			System.out.println(StringUtils.parseResource(participant)+ " is now known as " + newNickname + ".");
		}

		@Override
		public void ownershipGranted(String arg0) {
			// TODO Auto-generated method stub

		}

		@Override
		public void ownershipRevoked(String arg0) {
			// TODO Auto-generated method stub

		}

		@Override
		public void voiceGranted(String arg0) {
			// TODO Auto-generated method stub

		}

		@Override
		public void voiceRevoked(String arg0) {
			// TODO Auto-generated method stub

		}

	}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐