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.mzph.cn/news/258064.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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…

SQL Server 2012安装图解

方法/步骤 在资源管理器中双击SQL Server 2012的安装光盘&#xff0c;此时会出现一个安装窗口&#xff0c;在左侧的界面中点击“安装”选项卡&#xff0c;如图所示。然后点击右边的第一项“全新SQL Server 独立安装...”选项。 点击“下一步”按钮继续下一步安装。耐心等待片刻…

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;这里没有过高要求…

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…

CodeVS 1081 线段树练习 2

1081 线段树练习 2 时间限制: 1 s空间限制: 128000 KB题目等级 : 大师 Master题目描述 Description给你N个数&#xff0c;有两种操作 1&#xff1a;给区间[a,b]的所有数都增加X 2&#xff1a;询问第i个数是什么&#xff1f; 输入描述 Input Description第一行一个正整数n&#…

iOS开发UI篇—九宫格坐标计算

iOS开发UI篇—九宫格坐标计算 一、要求 完成下面的布局 二、分析 寻找左边的规律&#xff0c;每一个uiview的x坐标和y坐标。 三、实现思路 (1)明确每一块用得是什么view (2)明确每个view之间的父子关系&#xff0c;每个视图都只有一个父视图&#xff0c;拥有很多的子视图。 (3)…

工业4.0时代企业如何用CRM实现模式变革

当前&#xff0c;全球经济正处于变革的巨大浪潮之中&#xff0c;对于制造业来说&#xff0c;德国提出工业4.0&#xff0c;美国提出工业互联网&#xff0c;而我国&#xff0c;正在大力推进“中国制造2025”。制造业实现转型升级势在必行。我国政府提出&#xff0c;要大力支持传统…

Nginx 反向代理 websocket 协议

为什么80%的码农都做不了架构师&#xff1f;>>> 主要配置内容 server {listen 80;server_name xxx.xxx.xxx;location / {try_files $uri $uri/ /index.html;root /workspace/www;index index.html index.htm;}location ^~/letchat/ {proxy_pass http:/…

oracle中区间大小,Oracle的逻辑结构(表空间、段、区间、块)——总结

Oracle逻辑结构全景结构图以下为个人整理的一些关于Oracle逻辑结构的相关数据字典&#xff1a;SELECT * FROMDBA_TABLESPACES--记录各个表空间的详细信息SELECT * FROMDBA_TABLESPACE_USAGE_METRICS--记录各个表空间的使用状况SELECT * FROMDBA_DATA_FILES --记录各个数据文件的…

[C++] Nested Radical Constant

做高数助教被天煞的大一学生坑了&#xff0c;发现是个未解问题&#xff0c;没有解析解。。 用C搞了下&#xff0c;就是这样。。。 No closed-form expression is known for this constant (Finch 2003, p. 8; S. Plouffe, pers. comm., Aug. 29, 2008). /*********************…

api-gateway实践(03)新服务网关 - 网关请求拦截检查

参考链接&#xff1a;http://www.cnblogs.com/jivi/archive/2013/03/10/2952829.html 一、为什么要拦截检查请求&#xff1f; 防止重放攻击、篡改重放&#xff0c;进行使用规格检查 1、请求可能是重放攻击 重放攻击的基本原理就是把以前窃听到的数据原封不动地重新发送给接收方…

转载-使用 Feed4JUnit 进行数据与代码分离的 Java 单元测试

JUnit 是被广泛应用的 Java 单元测试框架&#xff0c;但是它没有很好的提供参数化测试的支持&#xff0c;很多测试人员不得不把测试数据写在程序里或者通过其它方法实现数据与代码的分离&#xff0c;在后续的修改和维护上有诸多限制和不便。Feed4JUnit 是开源的基于 JUnit 的扩…

dp递推 hdu1978

How many ways Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5422 Accepted Submission(s): 3185 Problem Description这是一个简单的生存游戏&#xff0c;你控制一个机器人从一个棋盘的起始点(1,1)走到棋盘的…

glTF格式初步了解

glTF格式初步了解近期看到Qt 3D的进展。偶然了解到了一种新的格式&#xff1a;glTF格式。这样的格式据说比现有的3D格式更加符合OpenGL应用的须要。这引起了我的好奇。于是我在Qt 3D的外部链接中找到了有关glTF的相关链接。上海萌梦信息科技有限公司&#xff08;微博&#xff1…

【第二十七章】 springboot + zipkin(brave-okhttp实现)

本文截取自&#xff1a;http://blog.csdn.net/liaokailin/article/details/52077620 一、前提 1、zipkin基本知识&#xff1a;附8 zipkin 2、启动zipkin server&#xff1a; 2.1、在官网下载服务jar&#xff0c;http://zipkin.io/pages/quickstart.html&#xff0c;之后使用命令…