1,聊天室新舊訊息的記錄,先看看一段伺服器返回的XML吧
<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>節點。所以我們以這個為根據來判斷。下邊貼些My Code,因為伺服器被我們給改了,所以返回的有些出入。但八九不離十。原理一樣。
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("這是舊的訊息");}
這段代碼寫哪裡呢,就是寫在訊息的監聽裡頭
/** * PacketListener 通過一個規定的過濾器提供一個機制來監聽資料包 * * @author liaonaibo * */class ChatPacketListener implements PacketListener
重寫它的方法
@Overridepublic void processPacket(Packet packet)
好了,下邊講踢人吧
2,踢人:
踢人很簡單,只要你是房主,或管理員什麼的,主持人也行。這些高許可權的才能有踢人的許可權。
// 踢人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吧。如果有人堅持要用自己的暱稱,這個可以的,具體怎麼樣做,下次再闡述。