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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal