openfire學習4------->android客戶端聊天開發之聊天功能開發

前面咱們已經把服務器搭建完成,而且在客戶端實現了登陸了。服務器


和咱們使用的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

就不貼圖了


這就大體完成功能了,固然離作成項目還有一些距離,但願能幫到須要用到這個作聊天的,或者是但願學習這個的朋友

相關文章
相關標籤/搜索