Android基於XMPP Smack openfire 開發的聊天室(三) 【新舊記錄、踢人】

yangxi_001發表於2014-03-05
1,聊天室新舊訊息的記錄,先看看一段伺服器返回的XML吧
  1. <message  
  2.     from='darkcave@chat.shakespeare.lit/firstwitch'  
  3.     to='hecate@shakespeare.lit/broom'  
  4.     type='groupchat'>  
  5.   <body>Thrice the brinded cat hath mew'd.</body>  
  6.   <delay xmlns='urn:xmpp:delay'  
  7.      from='crone1@shakespeare.lit/desktop'  
  8.      stamp='2002-10-13T23:58:37Z'/>  
  9. </message>  
  10.    
  11. <message  
  12.     from='darkcave@chat.shakespeare.lit/secondwitch'  
  13.     to='hecate@shakespeare.lit/broom'  
  14.     type='groupchat'>  
  15.   <body>Thrice and once the hedge-pig whined.</body>  
  16.   <delay xmlns='urn:xmpp:delay'  
  17.      from='wiccarocks@shakespeare.lit/laptop'  
  18.      stamp='2002-10-13T23:58:43Z'/>  
  19. </message>  
  20.    
  21. <message  
  22.     from='darkcave@chat.shakespeare.lit/thirdwitch'  
  23.     to='hecate@shakespeare.lit/broom'  
  24.     type='groupchat'>  
  25.   <body>Harpier cries 'Tis time, 'tis time.</body>  
  26.   <delay xmlns='urn:xmpp:delay'  
  27.      from='hag66@shakespeare.lit/pda'  
  28.      stamp='2002-10-13T23:58:49Z'/>  
  29. </message>  


上邊這段是一個聊天室返回的XML資料,是歷史訊息。就在這裡要告訴大家的是,如果是新訊息的話就沒有<delay>節點。所以我們以這個為根據來判斷。下邊貼些我的程式碼,因為伺服器被我們給改了,所以返回的有些出入。但八九不離十。原理一樣。

  1. DelayInformation inf = (DelayInformation) message.getExtension(  
  2.                         "x""jabber:x:delay");  
  3.                 System.out.println("判斷訊息");  
  4.                 if (inf == null && count >= 1) {  
  5.                     System.out.println("新訊息來了");  
  6.                     isHistory = true;  
  7.                 } else {  
  8.                     System.out.println("這是舊的訊息");  
  9.                 }  


 

這段程式碼寫哪裡呢,就是寫在訊息的監聽裡頭

  1. /** 
  2.      * PacketListener 通過一個規定的過濾器提供一個機制來監聽資料包 
  3.      *  
  4.      * @author liaonaibo 
  5.      *  
  6.      */  
  7.       
  8.     class ChatPacketListener implements PacketListener   


 

重寫它的方法
  1. @Override  
  2.         public void processPacket(Packet packet)  


 

好了,下邊講踢人吧

2,踢人:

        踢人很簡單,只要你是房主,或管理員什麼的,主持人也行。這些高許可權的才能有踢人的許可權。

  1. // 踢人  
  2.             try {  
  3.                 String nickName = affiliates.get(id);  
  4.                 //得到的暱稱包含的房間名和服務名的一段很長資料。好像是吧。哈哈,忘記了。所以擷取吧  
  5.                 muc.kickParticipant(nickName  
  6.                         .substring(nickName.indexOf("]") + 1), "看你不爽就 踢了你");  
  7.                 android.os.Message msg = new android.os.Message();  
  8.                 msg.what = MEMBER;  
  9.                 handler.sendMessage(msg);  
  10.                 Toast.makeText(this"哈哈,踹了你", Toast.LENGTH_LONG).show();  
  11.             } catch (XMPPException e) {  
  12.                 e.printStackTrace();  
  13.                 Toast.makeText(this"你沒有權利踢人", Toast.LENGTH_LONG).show();  
  14.             }  

有的哥們會疑惑,說如果根據暱稱來踢人,那會不會把重名的人都一起踢了。這個問題我也想過,這個也是測試的一個弊端。但是如果通過spark來看,即便你用同樣的名字加入了房間,要麼會報錯,要麼就是系統自動在你的名字後邊加個2,呵呵,夠2吧。如果有人堅持要用自己的暱稱,這個可以的,具體怎麼樣做,下次再闡述。

相關文章