openfire Android学习(三)----会议室创建、加入以及查询会议室中所有成员等
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
- }
openfire Android学习(三)----会议室创建、加入以及查询会议室中所有成员等的更多相关文章
- openfire Android学习(六)----总结
Xmpp的一些方法整理到一个工具类中了 XmppConnection.java [java] view plaincopy [java] view plaincopy import java.io.B ...
- android学习三---创建第一个程序
1.创建一个Helloworld程序 1.1 new-android application 点击file-new-android application出现如下界面 填上应用名,项目名,包名,选择所 ...
- openfire Android学习(一)----实现用户注册、登录、修改密码和注销等
以前学习过用Scoket 建立聊天,简单的建立聊天是没问题的,但如果要实现多人复杂的聊天,后台服务器代码就比较复杂,对于我这新手来讲就比较难了.后来在网上看到用openfire做服务器,利用强大的Sm ...
- android学习七(创建自己定义控件)
前面学习的是android的基本控件和布局的使用,可是主要的控件和布局有时候并不能实现复杂的布局.我们来看下各种控件和布局的关系. 可见全部的控件都是直接或者间接的继承自View的,全部的布局都是直接 ...
- openfire Android学习(五)------连接断开重连
首先要创建连接监听器,用来监听连接状态,这里我写了一个类 继承了ConnectionListener,重写了里面5个方法,最重要的两个方法connectionClosed()和connectionCl ...
- openfire Android 学习(四)----单人聊天和多人聊天(发送消息、接收消息)
一.单人聊天 1)发送消息: 首先要获取一个聊天窗口,getConnection()为获取连接connection的方法,调用getFriendChat()获取 [java] view plainco ...
- openfire Android学习---android客户端聊天开发之登录 和 注销登录
一切就绪,新建一个android测试工程: 上网权限配置,界面绘制啥的,这里就不说了. 首先 导入一个smark包.这个是用来维护长连接的,也可以是asmark.我用的是asmark 先普及一些基本知 ...
- Android学习三:线程操作
作为Android开发的组成部分,多线程的作用举足轻重,先来说说应用场景 1多线程使用场景 1.1正常使用中,经常有子线程来更新界面UI的需求,但是安卓不允许子线程更新UI 使用子线程处理UI,若线程 ...
- android学习-2 (AVD 创建)
在Android studio的tools下选择AVD manager 按照指示选择相应的硬件和系统映像. 在模拟器中运行应用 选择RUN APP 选择RUN时,并不只运行应用,还会处理运行应用所需要 ...
随机推荐
- selenium2常用API介绍
我们模拟web操作都是基于元素来操作的,我们首先要先确定元素,然后这个元素下对应的方法就可以看WebElement的方法. 1.点击操作 WebElement button=driver.findEl ...
- JAVA里的别名机制
别名现象主要出现在赋值的问题上: 对基本数据类型的赋值是很简单的.基本数据类型存储了实际的数值,而并非指向一个对象的引用,所以在为其赋值的时候,是直接将一个地方的内容复制到了另一个地方.例如,对基本数 ...
- POJ-3278 广度优先搜索入门
#include<stdio.h> #include<stdlib.h> struct node{ int x; int s; }s[]; int main(){ ]={}; ...
- syntax error, error in :'e id=1?', expect QUES, actual QUES pos 66, line 1, column 66, token QUES错误
在查询数据库的时候报了下面的异常: syntax error, error in :'e id=1?', expect QUES, actual QUES pos 66, line 1, column ...
- 如何打造一个"逼格"的web前端项目
最近利用空余的时间(坐公交车看教程视频),重新了解了前后端分离,前端工程化等概念学习,思考如何打造一个“逼格”的web前端项目. 前端准备篇 前端代码规范:制定前端开发代码规范文档. PS:重中之中, ...
- maya 2014帮助手册中 三维概念讲解
maya 2014 帮助手册中 三维概念讲解 多边形简介 三个或更多的边, 顶点 边 面 组成 经常使用三边形或四边形来建模 n边形不常用 单个多边形称为面 多个面连接到 ...
- 如何在 Rails 中搭配 Turbolinks 使用 Vue
[Rails] Vue-outlet for Turbolinks 在踩了 Rails + Turbolinks + Vue 的許多坑後,整理 的作法並和大家分享. Initialize the A ...
- 2018省赛赛第一次训练题解和ac代码
第一次就去拉了点思维很神奇的CF题目 2018省赛赛第一次训练 # Origin Title A CodeForces 607A Chain Reaction B CodeForces ...
- P2564 生日礼物
生日礼物 洛谷链接 题目描述: 在一段彩带上有不同颜色的彩珠,求出包含所有颜色彩珠的最短彩带长度. 思路: 我们可以把按彩珠的位置把所有彩珠排一下序,然后从1开始遍历这些彩珠,并记录出现过的颜色数目, ...
- 如何正确遍历删除List中的元素
遍历删除List中的元素有很多种方法,当运用不当的时候就会产生问题.下面主要看看以下几种遍历删除List中元素的形式: 1.通过增强的for循环删除符合条件的多个元素 2.通过增强的for循环删除符合 ...
