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

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


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

就不貼圖了


這就大致完成功能了,當然離做成項目還有一些距離,希望能幫到需要用到這個做聊天的,或者是希望學習這個的朋友

轉載于:https://www.cnblogs.com/jasonkent27/p/4098442.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/258064.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258064.shtml
英文地址,請注明出處:http://en.pswp.cn/news/258064.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

運用runtime與AOP實現oc中的kvo

前言: oc中實現的kvo觀察者模式比較呆板,不支持block,運用runtime機制將其進行實現。 詳細實現步驟: 一&#xff1a;給NSObject添加分類(添加相應的添加觀察者,刪除觀察者的方法),這樣凡是繼承NSObject的類生成的對象都會擁有這兩個方法。 二:在添加觀察者的方法中,檢查本類是否…

CentOS下IPTABLES配置詳解

iptables是與Linux內核集成的IP信息包過濾系統&#xff0c;其自帶防火墻功能&#xff0c;我們在配置完服務器的角色功能后&#xff0c;需要修改iptables的配置。配置CentOS和Ubuntu等linux服務器時需要對服務器的iptables進行配置&#xff0c;以下是iptables常見的幾種配置方法…

mysql教程詳解之多表聯合查詢,MYSQL教程mysql多表聯合查詢返回一張表的內容實現代碼...

搜索熱詞《MysqL教程MysqL多表聯合查詢返回一張表的內容實現代碼》要點&#xff1a;本文介紹了MysqL教程MysqL多表聯合查詢返回一張表的內容實現代碼&#xff0c;希望對您有用。如果有疑問&#xff0c;可以聯系我們。今天在使用MysqL語句的時候老是報錯,語句如下&#xff1a;sq…

C#實現冒泡排序

一、算法原理 1、比較相鄰的元素。如果第一個比第二個大&#xff0c;就交換他們兩個。 2、對每一對相鄰元素作同樣的工作&#xff0c;從開始第一對到結尾的最后一對。在這一點&#xff0c;最后的元素應該會是最大的數。 3、針對所有的元素重復以上的步驟&#xff0c;除了最后一…

PHP - 使用 Pear 進行安裝和卸載包

安裝&#xff1a; 首先運行到php根目錄&#xff1a; 輸入要安裝的包文件名&#xff1a; 使用語法&#xff1a; pear install 要安裝包的名稱 回車確認&#xff1a; 如果沒有其他意外&#xff0c;顯示安裝成功。查看安裝的包的信息&#xff1a; 語句&#xff1a; pear info 包的…

CYQ.Data 輕量數據層之路 V2.0 震撼驚世 支持多數據庫/內置Aop(二十五)

所有文章索引&#xff1a;CYQ.Data 輕量數據層之路 框架開源系列 索引 前言&#xff1a; 從V1.5發布到現在時隔20天了&#xff0c;終于發布2.0版本了&#xff0c;2.0系列版本由于引入多數據庫支持&#xff0c;內部結構改動較大。 但是外面調用方式仍保持一致向下兼容&#xff0…

matlab 捕食者和獵物,MATLAB - 追求曲線(捕食者/獵物)

在我的工程課上&#xff0c;我們編寫了一個“非平凡的”捕食者/獵物追捕問題。以下是情況的要點&#xff1a;有一個獵物試圖逃脫捕食者。每個都可以建模為可以在MATLAB中制作動畫的粒子(我們必須使用這種編碼語言)。獵物&#xff1a;可以比捕食者更容易操縱(轉彎)捕食者&#x…

SQL Server 2012安裝圖解

方法/步驟 在資源管理器中雙擊SQL Server 2012的安裝光盤&#xff0c;此時會出現一個安裝窗口&#xff0c;在左側的界面中點擊“安裝”選項卡&#xff0c;如圖所示。然后點擊右邊的第一項“全新SQL Server 獨立安裝...”選項。 點擊“下一步”按鈕繼續下一步安裝。耐心等待片刻…

C#中讀寫INI文件

INI文件就是擴展名為“ini”的文件。在Windows系統中&#xff0c;INI文件是很多&#xff0c;最重要的就是“System.ini”、“System32.ini”和“Win.ini”。該文件主要存放用戶所做的選擇以及系統的各種參數。用戶可以通過修改INI文件&#xff0c;來改變應用程序和系統的很多配…

html5響應式設置meta

1 <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <!--放大頁面到設備合適的分辨率--> 若不支持&#xff0c;請使用兼容ie的js 1 <!--[if lt IE 9]> 2 <script src"http://css3-mediaqueries-js.goo…

jmap在ubuntu上DebuggerException: Can't attach to the process

解決&#xff1a; 臨時&#xff1a; 1.echo 0 >/proc/sys/kernel/yama/ptrace_scope 永久&#xff1a; 2.修改 /etc/sysctl.d/10-ptrace.conf&#xff0c;設置kernel.yama.ptrace_scope0 參考&#xff1a;http://bugs.java.com/bugdatabase/view_bug.do?bug_id7050524轉載于…

C/C++中對鏈表操作的理解實例分析

鏈表概述   鏈表是一種常見的重要的數據結構。它是動態地進行存儲分配的一種結構。它可以根據需要開辟內存單元。鏈表有一個“頭指針”變量&#xff0c;以head表示&#xff0c;它存放一個地址。該地址指向一個元素。鏈表中每一個元素稱為“結點”&#xff0c;每個結點都應包括…

idea寫java spark程序,Spark : 在IDEA中用scala編寫Spark的WordCount程序并提交運行

使用IDEA新建maven工程&#xff0c;添加相關依賴&#xff1a;1.81.82.11.112.3.02.7.7utf-8org.scala-langscala-library${scala.version}org.apache.sparkspark-core_2.11${spark.version}org.apache.hadoophadoop-client2.7.7給項目添加scala支持&#xff0c;新建Scala Objec…

Contest - 2014 SWJTU ACM 手速測試賽(2014.10.31)

題目列表&#xff1a; 2146 Problem A【手速】闊綽的Dim2147 Problem B【手速】頹廢的Dim2148 Problem C【手速】我的滑板鞋2149 Problem D【手速】潦倒的Dim2150 Problem E【手速】被NTR的Dim2146 Problem A&#xff1a; 簡單的最長回文串統計算法&#xff0c;這里沒有過高要求…

利用Vagrant and VirtualBox搭建core os環境

利用Vagrant and VirtualBox搭建core os環境 系統環境 ubuntu 14.04 x64vagrant 1.7.4virtualbox 4.3.10git 1.9.1# 安裝 virtualbox, git sudo apt-get install virtualbox, git# 軟件中心的vagrant版本太低,因此去官網獲取最新的軟件包地址 wget https://releases.hashicorp.…

php關注 取消關注事件,微信公眾平臺開發關注/取消關注事件例子

用戶在關注與取消關注公眾號時&#xff0c;微信會把這個事件推送到開發者填寫的URL。方便開發者給用戶下發歡迎消息或者做帳號的解綁下面是一個微信公眾平臺關注和取消關注的實例:responseMsg();} else {$wechatObj->valid();}class wechatCallbackapiTest {public function…

DFS應用——遍歷有向圖+判斷有向圖是否有圈

【0】README 0.1&#xff09; 本文總結于 數據結構與算法分析&#xff0c; 源代碼均為原創&#xff0c; 旨在 理解 “DFS應用——遍歷有向圖判斷有向圖是否有圈” 的idea 并用源代碼加以實現 &#xff1b;0.2&#xff09; 判斷有向圖是否有圈的rule—— 一個有向圖是無圈圖當且…

AbleCloud智能行業解決方案助力體重秤企業向“中國智造”轉變

近年來&#xff0c;體重秤消費群體的年齡層次與需求逐漸向多元化發展&#xff0c;品牌眾多、競爭激烈的傳統體重秤行業迎來了前所未有的挑戰——智能體重秤成為行業發展的大趨勢&#xff0c;功能單一、同質化嚴重已經成為阻礙傳統體重秤企業成長的桎梏&#xff0c;打造出具備“…

javaScript事件(一)事件流

一、事件 事件是文檔或者瀏覽器窗口中發生的&#xff0c;特定的交互瞬間。 事件是用戶或瀏覽器自身執行的某種動作&#xff0c;如click,load和mouseover都是事件的名字。 事件是javaScript和DOM之間交互的橋梁。 你若觸發&#xff0c;我便執行——事件發生&#xff0c;調用它的…

php輸入對話框,如何使用JavaScript實現輸入對話框

我們有時在網頁上進行注冊用戶信息時會出現彈窗進行提示&#xff0c;你需要輸入內容進行確認&#xff0c;那么&#xff0c;這樣的輸入對話框是怎么實現的呢&#xff1f;本篇文章就來介紹關于使用JavaScript實現輸入對話框的方法。我們可以使用prompt顯示輸入對話框要在JavaScri…