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. for (HostedRoom k : MultiUserChat.getHostedRooms(connection,
  12. connection.getServiceName())) {
  13. for (HostedRoom j : MultiUserChat.getHostedRooms(connection,
  14. k.getJid())) {
  15. RoomInfo info2 = MultiUserChat.getRoomInfo(connection,
  16. j.getJid());
  17. if (j.getJid().indexOf("@") > 0) {
  18. FriendRooms friendrooms = new FriendRooms();
  19. friendrooms.setName(j.getName());//聊天室的名称
  20. friendrooms.setJid(j.getJid());//聊天室JID
  21. friendrooms.setOccupants(info2.getOccupantsCount());//聊天室中占有者数量
  22. friendrooms.setDescription(info2.getDescription());//聊天室的描述
  23. friendrooms.setSubject(info2.getSubject());//聊天室的主题
  24. list.add(friendrooms);
  25. }
  26. }
  27. }
  28. }
  29. return list;
  30. }

五、监听会议室的消息

添加会议室消息监听 :

[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. }

六、发送会议室消息

[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. @Override
  9. public void adminGranted(String arg0) {
  10. // TODO Auto-generated method stub
  11. }
  12. @Override
  13. public void adminRevoked(String arg0) {
  14. // TODO Auto-generated method stub
  15. }
  16. @Override
  17. public void banned(String arg0, String arg1, String arg2) {
  18. // TODO Auto-generated method stub
  19. }
  20. @Override
  21. public void joined(String participant) {
  22. System.out.println(StringUtils.parseResource(participant)+ " has joined the room.");
  23. }
  24. @Override
  25. public void kicked(String arg0, String arg1, String arg2) {
  26. // TODO Auto-generated method stub
  27. }
  28. @Override
  29. public void left(String participant) {
  30. // TODO Auto-generated method stub
  31. System.out.println(StringUtils.parseResource(participant)+ " has left the room.");
  32. }
  33. @Override
  34. public void membershipGranted(String arg0) {
  35. // TODO Auto-generated method stub
  36. }
  37. @Override
  38. public void membershipRevoked(String arg0) {
  39. // TODO Auto-generated method stub
  40. }
  41. @Override
  42. public void moderatorGranted(String arg0) {
  43. // TODO Auto-generated method stub
  44. }
  45. @Override
  46. public void moderatorRevoked(String arg0) {
  47. // TODO Auto-generated method stub
  48. }
  49. @Override
  50. public void nicknameChanged(String participant, String newNickname) {
  51. System.out.println(StringUtils.parseResource(participant)+ " is now known as " + newNickname + ".");
  52. }
  53. @Override
  54. public void ownershipGranted(String arg0) {
  55. // TODO Auto-generated method stub
  56. }
  57. @Override
  58. public void ownershipRevoked(String arg0) {
  59. // TODO Auto-generated method stub
  60. }
  61. @Override
  62. public void voiceGranted(String arg0) {
  63. // TODO Auto-generated method stub
  64. }
  65. @Override
  66. public void voiceRevoked(String arg0) {
  67. // TODO Auto-generated method stub
  68. }

openfire Android学习(三)----会议室创建、加入以及查询会议室中所有成员等的更多相关文章

  1. openfire Android学习(六)----总结

    Xmpp的一些方法整理到一个工具类中了 XmppConnection.java [java] view plaincopy [java] view plaincopy import java.io.B ...

  2. android学习三---创建第一个程序

    1.创建一个Helloworld程序 1.1 new-android application 点击file-new-android application出现如下界面 填上应用名,项目名,包名,选择所 ...

  3. openfire Android学习(一)----实现用户注册、登录、修改密码和注销等

    以前学习过用Scoket 建立聊天,简单的建立聊天是没问题的,但如果要实现多人复杂的聊天,后台服务器代码就比较复杂,对于我这新手来讲就比较难了.后来在网上看到用openfire做服务器,利用强大的Sm ...

  4. android学习七(创建自己定义控件)

    前面学习的是android的基本控件和布局的使用,可是主要的控件和布局有时候并不能实现复杂的布局.我们来看下各种控件和布局的关系. 可见全部的控件都是直接或者间接的继承自View的,全部的布局都是直接 ...

  5. openfire Android学习(五)------连接断开重连

    首先要创建连接监听器,用来监听连接状态,这里我写了一个类 继承了ConnectionListener,重写了里面5个方法,最重要的两个方法connectionClosed()和connectionCl ...

  6. openfire Android 学习(四)----单人聊天和多人聊天(发送消息、接收消息)

    一.单人聊天 1)发送消息: 首先要获取一个聊天窗口,getConnection()为获取连接connection的方法,调用getFriendChat()获取 [java] view plainco ...

  7. openfire Android学习---android客户端聊天开发之登录 和 注销登录

    一切就绪,新建一个android测试工程: 上网权限配置,界面绘制啥的,这里就不说了. 首先 导入一个smark包.这个是用来维护长连接的,也可以是asmark.我用的是asmark 先普及一些基本知 ...

  8. Android学习三:线程操作

    作为Android开发的组成部分,多线程的作用举足轻重,先来说说应用场景 1多线程使用场景 1.1正常使用中,经常有子线程来更新界面UI的需求,但是安卓不允许子线程更新UI 使用子线程处理UI,若线程 ...

  9. android学习-2 (AVD 创建)

    在Android studio的tools下选择AVD manager 按照指示选择相应的硬件和系统映像. 在模拟器中运行应用 选择RUN APP 选择RUN时,并不只运行应用,还会处理运行应用所需要 ...

随机推荐

  1. debian 升级glibc

    原因 wheezy是2.13,编译android4.4 需要2.14的,报错如下: rebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8-linar ...

  2. [POJ 1008] Maya Calendar C++解题

        Maya Calendar Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 62297   Accepted: 192 ...

  3. day01_13.数组

    数组基本语法 <?php $a = array(键1=>值1,键2=>值2); ?> <?php $arr = array(1=>'张三的裤子',2=>'李四 ...

  4. Mongodb 删除记录里的某个字段

    //例如要把User表中address字段删除 db.User.update({},{$unset:{'address':''}},false, true)

  5. Django 中CSRF中间件 'django.middleware.csrf.CsrfViewMiddleware',

    1.Django中CSRF中间件的工作原理及form表单提交需要添加{% csrf_token %}防止出现403错误 CSRF # 表示django全局发送post请求均需要字符串验证功能:防止跨站 ...

  6. [整理]菜鸟教程:docker使用笔记

    - docker # 查看 docker stats 指令的具体使用方法 - docker stats --help # 运行一个web应用 - docker pull training/webapp ...

  7. 九度oj 题目1496:数列区间

    题目描述: 有一段长度为n(1<=n<=1000000)的数列,数列中的数字从左至右从1到n编号.初始时数列中的数字都是0. 接下来我们会对其进行m(1<=m<=100000) ...

  8. 换肤功能的实现以及监听storage实现多个标签页一起换肤

    1:需求:项目的侧边栏实现换肤功能,核心代码: updateSkin (val) { const existSkinLink = document.head.querySelector('link[i ...

  9. 【bzoj1690】[Usaco2007 Dec]奶牛的旅行 分数规划+Spfa

    题目描述 作为对奶牛们辛勤工作的回报,Farmer John决定带她们去附近的大城市玩一天.旅行的前夜,奶牛们在兴奋地讨论如何最好地享受这难得的闲暇. 很幸运地,奶牛们找到了一张详细的城市地图,上面标 ...

  10. [CODEVS1911] 孤岛营救问题(分层图最短路)

    传送门 吐槽:神tm网络流... 用持有的钥匙分层,状态压缩,用 2 进制表示持有的钥匙集合. dis[i][j][k] 表示持有的钥匙集合为 k,到达点 (i, j) 的最短路径. 分层图的最短路听 ...