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

相关文章

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

idea中创建新类时自动添加注释的实现

《idea中创建新类时自动添加注释的实现》在每次使用idea创建一个新类时,过了一段时间发现看不懂这个类是用来干嘛的,为了解决这个问题,我们可以设置在创建一个新类时自动添加注释,帮助我们理解这个类的用... 目录前言:详细操作:步骤一:点击上方的 文件(File),点击&nbmyHIgsp;设置(Setti

浅谈mysql的sql_mode可能会限制你的查询

《浅谈mysql的sql_mode可能会限制你的查询》本文主要介绍了浅谈mysql的sql_mode可能会限制你的查询,这个问题主要说明的是,我们写的sql查询语句违背了聚合函数groupby的规则... 目录场景:问题描述原因分析:解决方案:第一种:修改后,只有当前生效,若是mysql服务重启,就会失效;

MySQL多列IN查询的实现

《MySQL多列IN查询的实现》多列IN查询是一种强大的筛选工具,它允许通过多字段组合快速过滤数据,本文主要介绍了MySQL多列IN查询的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析与优化1.