前面咱們已經把服務器搭建完成,而且在客戶端實現了登陸了。服務器
和咱們使用的QQ同樣,想想,登陸成功以後呢?確定是要有一個好友列表,經過這個列表,咱們能夠選擇咱們須要聊天的好友。學習
這裏咱們先研究下 xmpp的數據格式,再去實現咱們的好友列表測試
登陸成功後,咱們拿到的是一個鏈接 connection。spa
而後,經過這個connection,咱們能夠去獲取裏面的角色:Roster roster = connection.getRoster();對象
這裏咱們拿到了一個Rosrer對象,再經過這個對象,咱們能夠拿到全部的羣組 Collection<RosterGroup> entriesGroup = roster.getGroups();事件
再遍歷一下全部的組,便拿到了每一個組對應的用戶了哦get
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("======結束獲取組及用戶==========");
}
input
這個就是打印全部組成員的名字的一個方法,固然咱們確定須要將它放到一個listview中去,方便咱們點擊後進行聊天it
我就採起最笨的辦法了,將全部用戶遍歷出來,放到一個listview中去spark
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
就不貼圖了
這就大體完成功能了,固然離作成項目還有一些距離,但願能幫到須要用到這個作聊天的,或者是但願學習這個的朋友