前面我们已经把服务器搭建完成,并且在客户端实现了登录了。

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

openfire学习4---android客户端聊天开发之聊天功能开发相关推荐

  1. Android开发 Camera2开发_1_拍照功能开发

    Android开发 Camera2开发_1_拍照功能开发 介绍 google已经在Android5.1之后取消了对Camera1的更新,转而提供了功能更加强大的Camera2.虽然新版本依然可以使用C ...

  2. 基于Android的谷歌地图地理围栏功能开发

    第一步.Android使用谷歌地图权限 Android上使用谷歌地图 必备条件:翻墙.Android设备上安装Google Play Service 由于谷歌在国内已经被墙了,所以我们只能使用翻墙软件 ...

  3. php微信自定义菜单开发,微信公众平台开发自定义菜单功能开发

    一.简介 微信公众平台服务号以及之前成功申请内测资格的订阅号都具有自定义菜单的功能.开发者可利用该功能为公众账号的会话界面底部增加自定义菜单,用户点击菜单中的选项,可以调出相应的回复信息或网页链接.自 ...

  4. 个人在线学习网站(第五章 电子书管理功能开发)

    新增一个ebook页面--新增路由 the-header加菜单--点击跳转的页面--在index中添加路由--在the-header中跳转路由 使用PageHelper实现后端分页 集成PageHel ...

  5. 指南-Luat二次开发教程指南-功能开发教程-socket

    目录 socket 简介 API说明 实现流程 同步与异步 示例 开机与连接网络 连接服务器 socket发送与接收消息 常见问题 连接服务器失败 最多同时支持多少个连接 socket异常的情况排查 ...

  6. Luat模块应用手册-指南-Luat二次开发教程指南-功能开发教程-长连接超低功耗方案

    目录 简介 什么是超低功耗 能降低多少功耗 什么时候用 哪个版本才支持 实现方法 主要命令 示例 实现原理 两种心跳包 实现代码 常见问题 相关资料以及购买链接 相关开发板购买链接 简介 什么是超低功 ...

  7. 指南-Luat二次开发教程指南-功能开发教程-功耗管理

    目录 功耗管理 简介 常用模块功耗指标 API说明 3种工作模式: 1. 全功能模式 2. 休眠模式 3. 最少功能模式 实现流程 全功能模式 休眠模式 最少功能模式 示例 全功能模式 休眠模式 最少 ...

  8. Luat模块应用手册-指南-Luat二次开发教程指南-功能开发教程-虚拟AT

    目录 简介 实现方法 示例 常见问题 相关资料以及购买链接 测试源码 相关开发板购买链接 简介 虚拟AT 也叫 VAT , 'V' 的英文就是 virtual 虚拟的意思; ,传统的AT 是上位机何下 ...

  9. 指南-Luat二次开发教程指南-功能开发教程-蓝牙

    目录 蓝牙 简介 1.蓝牙概念 2.蓝牙使用场景 API说明 主模式 从模式 广播模式 实现流程 示例 常见问题 1.需要增加信号强度,用外置天线. 2.没有设置过蓝牙mac地址的模块,mac地址是随 ...

  10. C#开发 VSTO 自定义功能开发Ribbon显示在任意窗格栏

    1. 新建一个Word VSTO 外接程序 2. 右键添加一个功能区(可视化设计器) 3. 选中Ribbon F4 设置一下 RibbonType 为 Microsoft.Word.Document ...

最新文章

  1. 堆排序怎么建立初始堆_学习笔记-详解堆排序
  2. 企业分布式微服务云SpringCloud SpringBoot mybatis (九)Spring Boot多数据源配置与使用(JdbcTemplate支持)...
  3. java中日期格式转换
  4. memcached使用详解
  5. Java PushbackReader mark()方法与示例
  6. MyBatis复习(七):MyBatis批量处理
  7. 8Python全栈之路系列之Django Cookie 与Sessi
  8. screen中文乱码问题的解决
  9. MATLAB 求一个矩阵的最大值极其所在位置
  10. 模糊控制器原理笔记(附简单demo以及MATLAB相关操作)
  11. 几句代码让Ios系统内核崩溃
  12. SQL server 字符串 转 日期格式
  13. 关于阿里云个人网站备案流程的介绍
  14. 女子深夜醉酒后躺在马路中央,被路过的十几辆汽车压过,怎么定罪?
  15. 电脑故障恢复控制台命令
  16. circular 字体_Circular Regular
  17. 注意力机制(Attention)
  18. 牛客竞赛每日俩题 - Day2
  19. 程序员不了解这些投简历的巨坑,面试注定一开始就失败!
  20. 【Java Web】支付宝 AliPay 功能

热门文章

  1. Unsupported major.minor version 51.0(jdk版本错误)
  2. YOLOv5算法详解
  3. phpStorm中的unescaped xml character问题
  4. dubbo中对服务多版本的支持
  5. python3(七)os模块
  6. pca 主成分分析_超越普通PCA:非线性主成分分析
  7. 学习javascript_使用5行JavaScript进行机器学习
  8. 全志A33-USB虚拟网卡的配置与使用
  9. 你为什么会沉默,你们为什么又在后退呢?
  10. 通过 Service 访问 Pod - 每天5分钟玩转 Docker 容器技术(136)