openfire学习4---android客户端聊天开发之聊天功能开发
前面我們已經(jīng)把服務(wù)器搭建完成,并且在客戶端實(shí)現(xiàn)了登錄了。
和我們使用的QQ一樣,想一想,登錄成功之后呢?肯定是要有一個好友列表,通過這個列表,我們可以選擇我們需要聊天的好友。
這里我們先研究下 xmpp的數(shù)據(jù)格式,再去實(shí)現(xiàn)我們的好友列表
登錄成功后,我們拿到的是一個連接?connection。
然后,通過這個connection,我們可以去獲取里面的角色:Roster roster =?connection.getRoster();
這里我們拿到了一個Rosrer對象,再通過這個對象,我們可以拿到所有的群組 ? ?Collection<RosterGroup>?entriesGroup = roster.getGroups();
再遍歷一下所有的組,便拿到了每個組對應(yīng)的用戶了哦
? ?
public void getUsers(){ System.out.println("======開始獲取組及用戶=========="); Roster roster = connection.getRoster(); entriesGroup = roster.getGroups(); System.out.println("組的個數(shù):"+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("======結(jié)束獲取組及用戶==========");}這個就是打印所有組成員的名字的一個方法,當(dāng)然我們肯定需要將它放到一個listview中去,方便我們點(diǎn)擊后進(jìn)行聊天
我就采取最笨的辦法了,將所有用戶遍歷出來,放到一個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,其中已經(jīng)添加過兩個好友 ?admin ?test2
這里只是顯示了用戶名,其他信息都是本地先寫死的,不是用獲取到的來顯示的。我們用admin去登錄下spark,在里面我們可以看到,test1已經(jīng)處于在線狀態(tài)了:
給listview添加一個點(diǎn)擊事件,正常我們選擇一個聯(lián)系人,來和他聊天
聊天界面自己倒騰哦,我這就不貼上來了,比較丑(就是下面放了個edittext 和一個button,可以填入消息,點(diǎn)擊按鈕發(fā)送出去)
我們先做發(fā)送消息功能:
我們上面拿到的對象中,我們想在connection中肯定會有一個和聊天有關(guān)的,打開看一下果然;ChatManager cm = LoginActivity.connection.getChatManager();
按鈕點(diǎn)擊事件這塊的代碼我粘貼上來
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是通過對象來傳輸?shù)?#xff0c;這里面的對象自己考慮下是什么意思吧。
至于里面的account啊什么的一些信息,從上個listview點(diǎn)擊跳轉(zhuǎn)的時候使用intent帶過來(注:那些信息都在之前得到的 RosterEntry對象中)
到這里發(fā)一個消息給桌面版的spark看下吧:
看看spark是否收到
最下面是有的哦,前面的是我之前的測試消息,忽略掉啦。
到這里發(fā)送消息就完成了。
下面我們考慮下接收消息:
接收消息我們不一定是在那個用戶的聊天頁面中才會顯示,也可能在好友頁面,突然一個朋友來消息了,甚至按下menu退出了,又或者...情況太多了,當(dāng)然,需要滿足這樣的條件,我們實(shí)現(xiàn)思路肯定是用一個service去接收消息,收到消息后用廣播廣播出去啦。
下面我們就實(shí)現(xiàn)一下接收消息,至于要怎么廣播,自己想啦,依需求而定哦
Chat chat=cm.createChat(account, new MessageListener(){ public void processMessage(Chat arg0, Message msg) { Log.i("---", msg.getFrom()+"說:"+msg.getBody()); //添加消息到聊天窗口} });
添加這個監(jiān)聽器就哦了哦,我是直接添加到聊天中去了,其他的不管啦,反正公司現(xiàn)在也不打算用這個的,哈哈哈:
我使用最簡單的方法實(shí)現(xiàn)發(fā)送和接收消息:
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發(fā)送消息后,控制臺打印:07-16 14:42:07.472: I/---(21065): admin@im.comit.com.cn/Spark 2.6.3說:ddd
就不貼圖了
這就大致完成功能了,當(dāng)然離做成項(xiàng)目還有一些距離,希望能幫到需要用到這個做聊天的,或者是希望學(xué)習(xí)這個的朋友
轉(zhuǎn)載于:https://www.cnblogs.com/jasonkent27/p/4098442.html
總結(jié)
以上是生活随笔為你收集整理的openfire学习4---android客户端聊天开发之聊天功能开发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 运通百夫长黑金卡额度多少?额度有上限吗?
- 下一篇: Contest - 2014 SWJTU