前面我們已經把服務器搭建完成,并且在客戶端實現了登錄了。
和我們使用的QQ一樣,想一想,登錄成功之后呢?肯定是要有一個好友列表,通過這個列表,我們可以選擇我們需要聊天的好友。
這里我們先研究下 xmpp的數據格式,再去實現我們的好友列表
登錄成功后,我們拿到的是一個連接?connection。
然后,通過這個connection,我們可以去獲取里面的角色:Roster roster =?connection.getRoster();
這里我們拿到了一個Rosrer對象,再通過這個對象,我們可以拿到所有的群組 ? ?Collection<RosterGroup>?entriesGroup = roster.getGroups();
再遍歷一下所有的組,便拿到了每個組對應的用戶了哦
? ?
public void getUsers(){
System.out.println("======開始獲取組及用戶==========");
Roster roster = connection.getRoster();
entriesGroup = roster.getGroups();
System.out.println("組的個數:"+entriesGroup.size());
for(RosterGroup group: entriesGroup){
Collection<RosterEntry> entries = group.getEntries();
System.out.println("=========groupName==="+group.getName());
for (RosterEntry entry : entries) {
Log.i("TAG", "name: "+entry.getName());
System.out.println("組成員名字:"+entry.getName());
}
}
System.out.println("======結束獲取組及用戶==========");}
這個就是打印所有組成員的名字的一個方法,當然我們肯定需要將它放到一個listview中去,方便我們點擊后進行聊天
我就采取最笨的辦法了,將所有用戶遍歷出來,放到一個listview中去
ArrayList<RosterEntry> list;
for(RosterGroup group: LoginActivity.entriesGroup){
entries = (Collection<RosterEntry>) group.getEntries();
for (RosterEntry entry : entries) {
Log.i("TAG", "name: "+entry.getName());
System.out.println("組成員名字:"+entry.getName());
list.add(entry);
}
}
用一個listview把list中的所有成員顯示出來,這就不寫了,我只圖快,寫的的確也不咋的,相信大家都寫的比我的好
到這里,我們的listview就有了,貼一張我到這步的效果圖,大家莫要見笑。
我登錄的是test1,其中已經添加過兩個好友 ?admin ?test2
這里只是顯示了用戶名,其他信息都是本地先寫死的,不是用獲取到的來顯示的。我們用admin去登錄下spark,在里面我們可以看到,test1已經處于在線狀態了:
給listview添加一個點擊事件,正常我們選擇一個聯系人,來和他聊天
聊天界面自己倒騰哦,我這就不貼上來了,比較丑(就是下面放了個edittext 和一個button,可以填入消息,點擊按鈕發送出去)
我們先做發送消息功能:
我們上面拿到的對象中,我們想在connection中肯定會有一個和聊天有關的,打開看一下果然;ChatManager cm = LoginActivity.connection.getChatManager();
按鈕點擊事件這塊的代碼我粘貼上來
public void onClick(View arg0) {
EditText input=(EditText) findViewById(R.id.chat_input);
String content=input.getText().toString();
try {
ChatManager cm = LoginActivity.connection.getChatManager();
Message m=new Message();
m.setBody(content);
chat.sendMessage(m);
} catch (XMPPException e) {
e.printStackTrace();
}
}
xmpp是通過對象來傳輸的,這里面的對象自己考慮下是什么意思吧。
至于里面的account啊什么的一些信息,從上個listview點擊跳轉的時候使用intent帶過來(注:那些信息都在之前得到的 RosterEntry對象中)
到這里發一個消息給桌面版的spark看下吧:
看看spark是否收到
最下面是有的哦,前面的是我之前的測試消息,忽略掉啦。
到這里發送消息就完成了。
下面我們考慮下接收消息:
接收消息我們不一定是在那個用戶的聊天頁面中才會顯示,也可能在好友頁面,突然一個朋友來消息了,甚至按下menu退出了,又或者...情況太多了,當然,需要滿足這樣的條件,我們實現思路肯定是用一個service去接收消息,收到消息后用廣播廣播出去啦。
下面我們就實現一下接收消息,至于要怎么廣播,自己想啦,依需求而定哦
Chat chat=cm.createChat(account, new MessageListener(){
public void processMessage(Chat arg0, Message msg) {
Log.i("---", msg.getFrom()+"說:"+msg.getBody());
//添加消息到聊天窗口}
});
添加這個監聽器就哦了哦,我是直接添加到聊天中去了,其他的不管啦,反正公司現在也不打算用這個的,哈哈哈:
我使用最簡單的方法實現發送和接收消息:
send_btn.setOnClickListener(new OnClickListener(){
public void onClick(View arg0) {
EditText input=(EditText) findViewById(R.id.chat_input);
String content=input.getText().toString();
try {
ChatManager cm = LoginActivity.connection.getChatManager();
Chat chat=cm.createChat(account, new MessageListener(){
public void processMessage(Chat arg0, Message msg) {
Log.i("---", msg.getFrom()+"說:"+msg.getBody());
//添加消息到聊天窗口}
});
Message m=new Message();
m.setBody(content);
chat.sendMessage(m);
} catch (XMPPException e) {
e.printStackTrace();
}
}
});
代碼比較亂見諒了:用spark發送消息后,控制臺打印:07-16 14:42:07.472: I/---(21065): admin@im.comit.com.cn/Spark 2.6.3說:ddd
就不貼圖了
這就大致完成功能了,當然離做成項目還有一些距離,希望能幫到需要用到這個做聊天的,或者是希望學習這個的朋友