您的位置:首页 > 移动开发 > Android开发

Android基于XMPP Smack openfire 开发的聊天室(三) 【新旧记录、踢人】

2014-03-05 15:25 411 查看
1,聊天室新旧消息的记录,先看看一段服务器返回的XML吧

[html] view
plaincopyprint?

<message  

    from='darkcave@chat.shakespeare.lit/firstwitch'  

    to='hecate@shakespeare.lit/broom'  

    type='groupchat'>  

  <body>Thrice the brinded cat hath mew'd.</body>  

  <delay xmlns='urn:xmpp:delay'  

     from='crone1@shakespeare.lit/desktop'  

     stamp='2002-10-13T23:58:37Z'/>  

</message>  

   

<message  

    from='darkcave@chat.shakespeare.lit/secondwitch'  

    to='hecate@shakespeare.lit/broom'  

    type='groupchat'>  

  <body>Thrice and once the hedge-pig whined.</body>  

  <delay xmlns='urn:xmpp:delay'  

     from='wiccarocks@shakespeare.lit/laptop'  

     stamp='2002-10-13T23:58:43Z'/>  

</message>  

   

<message  

    from='darkcave@chat.shakespeare.lit/thirdwitch'  

    to='hecate@shakespeare.lit/broom'  

    type='groupchat'>  

  <body>Harpier cries 'Tis time, 'tis time.</body>  

  <delay xmlns='urn:xmpp:delay'  

     from='hag66@shakespeare.lit/pda'  

     stamp='2002-10-13T23:58:49Z'/>  

</message>  

上边这段是一个聊天室返回的XML数据,是历史消息。就在这里要告诉大家的是,如果是新消息的话就没有<delay>节点。所以我们以这个为根据来判断。下边贴些我的代码,因为服务器被我们给改了,所以返回的有些出入。但八九不离十。原理一样。

[java] view
plaincopyprint?

DelayInformation inf = (DelayInformation) message.getExtension(  

                        "x", "jabber:x:delay");  

                System.out.println("判断消息");  

                if (inf == null && count >= 1) {  

                    System.out.println("新消息来了");  

                    isHistory = true;  

                } else {  

                    System.out.println("这是旧的消息");  

                }  

 

这段代码写哪里呢,就是写在消息的监听里头

[java] view
plaincopyprint?

/** 

     * PacketListener 通过一个规定的过滤器提供一个机制来监听数据包 

     *  

     * @author liaonaibo 

     *  

     */  

      

    class ChatPacketListener implements PacketListener   

 
重写它的方法

[java] view
plaincopyprint?

@Override  

        public void processPacket(Packet packet)  

 

好了,下边讲踢人吧

2,踢人:

        踢人很简单,只要你是房主,或管理员什么的,主持人也行。这些高权限的才能有踢人的权限。

[java] view
plaincopyprint?

// 踢人  

            try {  

                String nickName = affiliates.get(id);  

                //得到的昵称包含的房间名和服务名的一段很长数据。好像是吧。哈哈,忘记了。所以截取吧  

                muc.kickParticipant(nickName  

                        .substring(nickName.indexOf("]") + 1), "看你不爽就 踢了你");  

                android.os.Message msg = new android.os.Message();  

                msg.what = MEMBER;  

                handler.sendMessage(msg);  

                Toast.makeText(this, "哈哈,踹了你", Toast.LENGTH_LONG).show();  

            } catch (XMPPException e) {  

                e.printStackTrace();  

                Toast.makeText(this, "你没有权利踢人", Toast.LENGTH_LONG).show();  

            }  

有的哥们会疑惑,说如果根据昵称来踢人,那会不会把重名的人都一起踢了。这个问题我也想过,这个也是测试的一个弊端。但是如果通过spark来看,即便你用同样的名字加入了房间,要么会报错,要么就是系统自动在你的名字后边加个2,呵呵,够2吧。如果有人坚持要用自己的昵称,这个可以的,具体怎么样做,下次再阐述。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: