Android基于XMPP Smack openfire 开发的聊天室(二) 【聊天信息、成员】

来源:互联网 发布:matlab最优化计算 编辑:程序博客网 时间:2024/06/05 18:29

       上一篇呢说了怎么进入这个聊天室,这次呢,咱就说聊天室里的功能吧,聊天信息、成员变动什么的。还是少说废话,正题:

1,说要聊天呢,简单就是一个文本信息,当然我们不能时时去服务器获取信息。要充分发挥即时推送嘛。

         (1)首先要添加一个监听,muc.addMessageListener(chatListener);   要是muc不知道是什么请看上一篇吧,这就不多解释。chatListener就是我们的监听器,看代码,其实下边的代码有些啰嗦。我只是懒得改了。最近有点烦躁。这里我们主要获取的就是Packet,这个是一个XMPP包装好的XML流,里边有你想要的东西。有兴趣深入的朋友可以上XMPP中文翻译组去看看,挺犀利的。

[java] view plaincopyprint?
  1. /** 
  2.      * PacketListener 通过一个规定的过滤器提供一个机制来监听数据包 
  3.      *  
  4.      * @author liaonaibo 
  5.      *  
  6.      */  
  7.     class ChatPacketListener implements PacketListener {  
  8.         private String _number;  
  9.         private Date _lastDate;  
  10.         private MultiUserChat _muc;  
  11.         private String _roomName;  
  12.   
  13.         public ChatPacketListener(MultiUserChat muc) {  
  14.             _number = "0";  
  15.             _lastDate = new Date(0);  
  16.             _muc = muc;  
  17.             _roomName = muc.getRoom();  
  18.         }  
  19.   
  20.         @Override  
  21.         public void processPacket(Packet packet) {  
  22.             Message message = (Message) packet;  
  23.             String from = message.getFrom();  
  24.   
  25.             if (message.getBody() != null) {  
  26.                 DelayInformation inf = (DelayInformation) message.getExtension(  
  27.                         "x""jabber:x:delay");  
  28.                 Date sentDate;  
  29.                 if (inf != null) {  
  30.                     sentDate = inf.getStamp();  
  31.                 } else {  
  32.                     sentDate = new Date();  
  33.                 }  
  34.   
  35.                 Log.i(TAG, "Receive old message: date="  
  36.                         + sentDate.toLocaleString() + " ; message="  
  37.                         + message.getBody());  
  38.   
  39.                 android.os.Message msg = new android.os.Message();  
  40.                 msg.what = RECEIVE;  
  41.                 Bundle bd = new Bundle();  
  42.                 bd.putString("from", from);  
  43.                 bd.putString("body", message.getBody());  
  44.                 msg.setData(bd);  
  45.                 handler.sendMessage(msg);  
  46.             }  
  47.         }  
  48.     }  


2,下边就是成员了,一个聊天室没成员多离谱的事情啊,我们主要做的是把成员列表逃出来。其实有几种方法可以弄出来的,我只是简单的获取成员的昵称。可能有朋友会问为什么不获取成员的信息呢。这个下一篇我会告诉你。

[java] view plaincopyprint?
  1. /** 
  2.      * 获取聊天室的所有成员 
  3.      */  
  4.     private void getAllMember() {  
  5.         Log.i(TAG, "获取聊天室的所有成员");  
  6.         affiliates.clear();  
  7.           
  8.         new Thread(new Runnable() {  
  9.             @Override  
  10.             public void run() {  
  11.                 try {  
  12.                     Iterator<String> it = muc.getOccupants();  
  13.                     while (it.hasNext()) {  
  14.                         String name = it.next();  
  15.                         name = name.substring(name.indexOf("/") + 1);  
  16.                         affiliates.add(name);  
  17.                         Log.i(TAG, "成员名字;" + name);  
  18.                     }  
  19.   
  20.                 } catch (Exception e) {  
  21.                     e.printStackTrace();  
  22.                 }  
  23.   
  24.                 android.os.Message msg = new android.os.Message();  
  25.                 msg.what = MEMBER;  
  26.                 handler.sendMessage(msg);  
  27.             }  
  28.         }).start();  
  29.     }  
0 0