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

本文主要是介绍Android基于XMPP Smack Openfire下学习开发IM(三)会议室创建、加入以及查询会议室中所有成员等,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

openfire 中的会议室不像QQ群一样,不能保存那些离线用户,加入会议室后,一旦断开连接,就会离开会议室。

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

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

一、创建会议室

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

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

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

[java]  view plain copy
  1. /** 
  2.      * 创建房间 
  3.      *  
  4.      * @param roomName 房间名称 
  5.      */  
  6.     public static void createRoom(String roomName) {  
  7.         if (connection == null) {  
  8.             return;  
  9.         }  
  10.         try {  
  11.             // 创建一个MultiUserChat  
  12.             MultiUserChat muc = new MultiUserChat(connection, roomName  
  13.                     + "@conference." + connection.getServiceName());  
  14.             // 创建聊天室  
  15.             muc.create(roomName); // roomName房间的名字  
  16.             // 获得聊天室的配置表单  
  17.             Form form = muc.getConfigurationForm();  
  18.             // 根据原始表单创建一个要提交的新表单。  
  19.             Form submitForm = form.createAnswerForm();  
  20.             // 向要提交的表单添加默认答复  
  21.             for (Iterator<FormField> fields = form.getFields(); fields  
  22.                     .hasNext();) {  
  23.                 FormField field = (FormField) fields.next();  
  24.                 if (!FormField.TYPE_HIDDEN.equals(field.getType())  
  25.                         && field.getVariable() != null) {  
  26.                     // 设置默认值作为答复  
  27.                     submitForm.setDefaultAnswer(field.getVariable());  
  28.                 }  
  29.             }  
  30.             // 设置聊天室的新拥有者  
  31.             List<String> owners = new ArrayList<String>();  
  32.             owners.add(connection.getUser());// 用户JID  
  33.             submitForm.setAnswer("muc#roomconfig_roomowners", owners);  
  34.             // 设置聊天室是持久聊天室,即将要被保存下来  
  35.             submitForm.setAnswer("muc#roomconfig_persistentroom"false);  
  36.             // 房间仅对成员开放  
  37.             submitForm.setAnswer("muc#roomconfig_membersonly"false);  
  38.             // 允许占有者邀请其他人  
  39.             submitForm.setAnswer("muc#roomconfig_allowinvites"true);  
  40.             // 进入是否需要密码  
  41.             //submitForm.setAnswer("muc#roomconfig_passwordprotectedroom", true);  
  42.             // 设置进入密码  
  43.             //submitForm.setAnswer("muc#roomconfig_roomsecret", "password");  
  44.             // 能够发现占有者真实 JID 的角色  
  45.             // submitForm.setAnswer("muc#roomconfig_whois", "anyone");  
  46.             // 登录房间对话  
  47.             submitForm.setAnswer("muc#roomconfig_enablelogging"true);  
  48.             // 仅允许注册的昵称登录  
  49.             submitForm.setAnswer("x-muc#roomconfig_reservednick"true);  
  50.             // 允许使用者修改昵称  
  51.             submitForm.setAnswer("x-muc#roomconfig_canchangenick"false);  
  52.             // 允许用户注册房间  
  53.             submitForm.setAnswer("x-muc#roomconfig_registration"false);  
  54.             // 发送已完成的表单(有默认值)到服务器来配置聊天室  
  55.             submitForm.setAnswer("muc#roomconfig_passwordprotectedroom"true);           
  56.             // 发送已完成的表单(有默认值)到服务器来配置聊天室  
  57.             muc.sendConfigurationForm(submitForm);  
  58.         } catch (XMPPException e) {  
  59.             e.printStackTrace();  
  60.         }  
  61.     }  

二、加入会议室

[java]  view plain copy
  1. /** 
  2.      * 加入会议室 
  3.      *  
  4.      * @param user 昵称 
  5.      * @param password 会议室密码 
  6.      * @param roomsName 会议室名 
  7.      * @param connection  
  8.      */  
  9.     public static MultiUserChat joinMultiUserChat(String user, String password, String roomsName,  
  10.             XMPPConnection connection) {  
  11.         try {  
  12.             // 使用XMPPConnection创建一个MultiUserChat窗口  
  13.             MultiUserChat muc = new MultiUserChat(connection, roomsName  
  14.                     + "@conference." + connection.getServiceName());  
  15.             // 聊天室服务将会决定要接受的历史记录数量  
  16.             DiscussionHistory history = new DiscussionHistory();  
  17.                 history.setMaxStanzas(0);  
  18.                         //history.setSince(new Date());  
  19.             // 用户加入聊天室  
  20.                 muc.join(user, password, history, SmackConfiguration.getPacketReplyTimeout());  
  21.             System.out.println("会议室加入成功........");  
  22.             return muc;  
  23.         } catch (XMPPException e) {  
  24.             e.printStackTrace();  
  25.             System.out.println("会议室加入失败........");  
  26.             return null;  
  27.         }  
  28.     }  

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

注意:这里查询出来的名字只是用户进入会议室所用的昵称

[java]  view plain copy
  1. /** 
  2.      * 查询会议室成员名字 
  3.      * @param muc 
  4.      */  
  5.     public static List<String> findMulitUser(MultiUserChat muc){  
  6.         List<String> listUser = new ArrayList<String>();  
  7.         Iterator<String> it = muc.getOccupants();  
  8.         //遍历出聊天室人员名称  
  9.         while (it.hasNext()) {  
  10.             // 聊天室成员名字  
  11.             String name = StringUtils.parseResource(it.next());  
  12.             listUser.add(name);  
  13.         }  
  14.         return listUser;  
  15.     }  


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

[java]  view plain copy
  1. /** 
  2.      * 获取服务器上所有会议室 
  3.      * @return 
  4.      * @throws XMPPException 
  5.      */  
  6.     public static List<FriendRooms> getConferenceRoom() throws XMPPException {  
  7.         List<FriendRooms> list = new ArrayList<FriendRooms>();  
  8.         new ServiceDiscoveryManager(connection);  
  9.         if (!MultiUserChat.getHostedRooms(connection,  
  10.                 connection.getServiceName()).isEmpty()) {  
  11.   
  12.             for (HostedRoom k : MultiUserChat.getHostedRooms(connection,  
  13.                     connection.getServiceName())) {  
  14.   
  15.                 for (HostedRoom j : MultiUserChat.getHostedRooms(connection,  
  16.                         k.getJid())) {  
  17.                     RoomInfo info2 = MultiUserChat.getRoomInfo(connection,  
  18.                             j.getJid());  
  19.                     if (j.getJid().indexOf("@") > 0) {  
  20.   
  21.                         FriendRooms friendrooms = new FriendRooms();  
  22.                         friendrooms.setName(j.getName());//聊天室的名称  
  23.                         friendrooms.setJid(j.getJid());//聊天室JID  
  24.                         friendrooms.setOccupants(info2.getOccupantsCount());//聊天室中占有者数量  
  25.                         friendrooms.setDescription(info2.getDescription());//聊天室的描述  
  26.                         friendrooms.setSubject(info2.getSubject());//聊天室的主题  
  27.                         list.add(friendrooms);  
  28.                     }  
  29.                 }  
  30.             }  
  31.         }  
  32.         return list;  
  33.     }  


五、监听会议室的消息

添加会议室消息监听 :

[java]  view plain copy
  1. multiChat.addMessageListener(new multiListener());  

[java]  view plain copy
  1. /** 
  2.      * 會議室信息監聽事件 
  3.      *  
  4.      * @author Administrator 
  5.      *  
  6.      */  
  7.     public class multiListener implements PacketListener {  
  8.         @Override  
  9.         public void processPacket(Packet packet) {  
  10.             Message message = (Message) packet;  
  11.             // 接收来自聊天室的聊天信息  
  12.             String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());  
  13.             MucHistory mh = new MucHistory();  
  14.             mh.setUserAccount(account);  
  15.             String from = StringUtils.parseResource(message.getFrom());  
  16.             String fromRoomName = StringUtils.parseName(message.getFrom());  
  17.             mh.setMhRoomName(fromRoomName);  
  18.             mh.setFriendAccount(from);  
  19.             mh.setMhInfo(message.getBody());  
  20.             mh.setMhTime(time);  
  21.             mh.setMhType("left");  
  22.   
  23.         }  
  24.     }  

六、发送会议室消息

[java]  view plain copy
  1. <strong>multiChat.sendMessage(str);//multiChat </strong>为聊天室对象  

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

添加监听事件:

[java]  view plain copy
  1. multiChat.addParticipantStatusListener(new ParticipantStatus());  

会议室状态监听事件:

[java]  view plain copy
  1. /** 
  2.      * 会议室状态监听事件 
  3.      *  
  4.      * @author Administrator 
  5.      *  
  6.      */  
  7.     class ParticipantStatus implements ParticipantStatusListener {  
  8.   
  9.         @Override  
  10.         public void adminGranted(String arg0) {  
  11.             // TODO Auto-generated method stub  
  12.   
  13.         }  
  14.   
  15.         @Override  
  16.         public void adminRevoked(String arg0) {  
  17.             // TODO Auto-generated method stub  
  18.   
  19.         }  
  20.   
  21.         @Override  
  22.         public void banned(String arg0, String arg1, String arg2) {  
  23.             // TODO Auto-generated method stub  
  24.   
  25.         }  
  26.   
  27.         @Override  
  28.         public void joined(String participant) {  
  29.             System.out.println(StringUtils.parseResource(participant)+ " has joined the room.");  
  30.         }  
  31.   
  32.         @Override  
  33.         public void kicked(String arg0, String arg1, String arg2) {  
  34.             // TODO Auto-generated method stub  
  35.   
  36.         }  
  37.   
  38.         @Override  
  39.         public void left(String participant) {  
  40.             // TODO Auto-generated method stub  
  41.             System.out.println(StringUtils.parseResource(participant)+ " has left the room.");  
  42.               
  43.         }  
  44.   
  45.         @Override  
  46.         public void membershipGranted(String arg0) {  
  47.             // TODO Auto-generated method stub  
  48.   
  49.         }  
  50.   
  51.         @Override  
  52.         public void membershipRevoked(String arg0) {  
  53.             // TODO Auto-generated method stub  
  54.   
  55.         }  
  56.   
  57.         @Override  
  58.         public void moderatorGranted(String arg0) {  
  59.             // TODO Auto-generated method stub  
  60.   
  61.         }  
  62.   
  63.         @Override  
  64.         public void moderatorRevoked(String arg0) {  
  65.             // TODO Auto-generated method stub  
  66.   
  67.         }  
  68.   
  69.         @Override  
  70.         public void nicknameChanged(String participant, String newNickname) {  
  71.             System.out.println(StringUtils.parseResource(participant)+ " is now known as " + newNickname + ".");  
  72.         }  
  73.   
  74.         @Override  
  75.         public void ownershipGranted(String arg0) {  
  76.             // TODO Auto-generated method stub  
  77.   
  78.         }  
  79.   
  80.         @Override  
  81.         public void ownershipRevoked(String arg0) {  
  82.             // TODO Auto-generated method stub  
  83.   
  84.         }  
  85.   
  86.         @Override  
  87.         public void voiceGranted(String arg0) {  
  88.             // TODO Auto-generated method stub  
  89.   
  90.         }  
  91.   
  92.         @Override  
  93.         public void voiceRevoked(String arg0) {  
  94.             // TODO Auto-generated method stub  
  95.   
  96.         }  
  97.   
  98.     }  

这篇关于Android基于XMPP Smack Openfire下学习开发IM(三)会议室创建、加入以及查询会议室中所有成员等的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/410728

相关文章

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN