关于XMPP第一篇-openfire的搭建写完后,就一直在赶本篇所要介绍的这个基于asmack+openfire的安卓客户端,费了不少精力,因为有不少同学在还在焦急的等待着(自恋了呵呵),所以紧赶慢赶,现在算做出来了一个比较初级的版本,很多功能还不完善,不过先放出来,供大家一起参考研究,提出问题,共同学习,当然,该项目本人是会不断完善,增加新功能,甚至到后来的群组,有兴趣的话,大家可以继续关注^-^
好了,接下来介绍下本项目实现的功能吧:
1.注册;
2.登录;
3.依昵称查找人员;
4.添加好友(发送好友申请,对方接收好友请求,并同意,方可成为好友);
5.界面上的,包括最近联系人,好友列表等;
6.聊天:目前支持的类型有文本,图片,位置,动态表情等;(这里要说明下,在该初级版本,图片的路径和位置坐标是固定的);
7.退出;
8.免登录;(一次登录成功,则下次启动软件时自动登录);
界面:
界面上的部分功能此版本并未实现,以及一些细节的处理,代码上的优化等都会循序渐进的改进,并在以后的博客中发出(由于时间问题,已不再更新维护)。
其实,纯为聊天而生的这种APP并不多,除了我们熟悉的QQ,微信等之外,其它的社交类应用基本都是将聊天这一块穿插进APP中,并且这种QQ式的添加好友等在现在的社交应用中也通常被改造为关注,被关注或者粉丝等,如比较知名的微博,陌陌等,不知名的那就多了去了。由于XMPP这块儿,互相聊天并不需要双方必须是好友关系,只需知道对方的JID即可收发消息,因此,许多应用也正是看中了这一点,来实现应用中的关注,粉丝等功能,而关注,取消关注,拉黑等功能是可以通过web服务实现的,而XMPP此时只充当了点对点的聊天功能,所以大家也不必纠结xmpp本身自带的邀请好友了,同意好友申请了,获取好友列表了等等,只需大致了解即可,重点是聊天过程的实现,以及客户端跟服务端连接的稳定性(如断线如何重连,XMPP自带的重连很不稳定)等等,当然,若有的同学钻研精神极强,或者公司有需求,那么你可以去深入研究了。
支持XMPP协议的服务端有不少,比较熟悉的就是openfire,而当一个项目真正决定使用openfire作为服务端时,想实现比较复杂点的功能的话或者是符合自己要求的功能,都需要去改造openfire,因为openfire有一定的局限性,但好在其是开源的,另外,一般的社交软件如果使用openfire的话,都是有两个服务端的,一个是自己的web服务端,一个就是openfire服务端,像好友头像,昵称,性别,年龄,地址,以及类似陌陌的照片墙等信息数据都是可通过web服务来存取的,只需web数据库跟of数据库的用户id对应起来即可,而只依靠openfire本身,这些资料的存取是无法实现的。做这个项目时,本打算将web和of结合起来,来实现更复杂更贴近实战的功能的,不过最后放弃了,应为这样工作量太大了,本人也没那么多精力和时间,呵呵!因此,如上说所,我们可以把精力主要集中在聊天,以及如何利用web上存储的大量信息来跟of结合起来,这才是重点!(--个人观点)
好了,现在我们来谈一下聊天过程中,如图片,语音,视频等信息如何通过xmpp传输,我也经常遇到有同学上来就问,xmpp怎么传语音啊,怎么传文件啊之类的(不过现在xmpp好像是支持文件传输了,具体没试过),其实,我们只要认真思考下,就能想到解决办法,xmpp传什么最快最简单?当然是字符串了!因此,我们就可以将我们想要的信息都放进字符串中传输过去,对方收到消息后解析之,便可得到一切你想要得到的东西,如本项目中,图片,以及位置消息的实现,就是将图片路径或者位置坐标跟接收者以及发送者的信息以某特定间隔符间隔并组装成一个字符串作为message的body发送过去(如:接收者*发送者*消息类型*消息内容*发送时间*。。。等等等),对方收到消息后以“*”拆分便可得到所有信息,岂不快哉?(当然更合理的可以直接用json格式发送)因此,对于图片语音视频等类型的信息,我们都只需要其路径即可,那么路径又怎么获得呢?就像我上面说的,配合web服务,现将图片语音等上传到web服务器(或者OSS云平台)获取上传成功后的路径,然后将路径作为字符串发送给对方,对方接收到消息后按消息类型解析,并根据路径下载图片或语音。。。具体可参考本项目的实现过程!
项目源码:
注意:源码部署后,找到Consts.java中的XMPP_HOST,需要修改为自己的IP地址(of端名称最好与本机IP一致,具体可参看上篇文章--openfire的安装和搭建),另:该客户端是要服务端即openfire支持的,如果不安装of端是运行不起来的。
PS:收到几位同学反馈的几个问题,一是登录成功后收不到好友请求信息,这个上面我说过,注意你的服务器名称要改为你的ip地址即与客户单的XMPP_HOST一致;二是聊天界面收到新消息后不会同步更新,这个因为当时用的一个手机测试的,疏忽了这点,其实这个也不难,可以参考下最近联系人界面的更新方式,即在聊天界面注册一个新消息接收广播,消息Listener中监听到新消息后(注意消息类型),将消息以广播的形式发送出去,聊天界面接到广播,并取出Msg,然后listMsg.add,adapter再notify一下即可,很简单吧,代码我就不贴了,这个大家可以自己琢磨下。。。——2015.01.26