最近在写一个即时通信的项目,用的也是xmpp,asmack和openfire,这个可以算是我做的第一个正式项目吧,所以也是一边查资料一边写的,虽说网上资料很多,但不少逻辑和需要注意的地方还是自己整理发现的,这里就分享一下,这一篇就先说下好友相关的功能吧,其他的再慢慢整理。

好友的相关功能最主要的就是框架中的Presence类了,首先它是Packet类的子类,所以可以通过连接.sendPacket()方法发送出去。

它内嵌两个枚举类型 Presence.Mode和Presence.Type

Presence.Type有七种

available (默认)用户空闲状态,即在线

unavailable 用户没空看消息,即离线

subscribe 请求订阅别人,即请求加对方为好友

subscribed  统一被别人订阅,也就是确认被对方加为好友

unsubscribe  他取消订阅别人,请求删除某好友

unsubscribed  拒绝被别人订阅,即拒绝对放的添加请求

error -- 当前状态packet有错误

Presence.Mode有五种

chat 相当于qq的q我吧

available 默认即在线状态

away 离开

xa  离开一段时间

dnd  请勿打扰

可以使用setStatus(String)自定义用户当前的状态,例如“我去吃饭了”

另外还有一点,就是好友双方对彼此的状态,有网友总结如下:

none:是用户和自己roster中的好友彼此不关心,既不想把自己的presence状态告诉对方,也不愿意收到对方presence更新消息

to:是关心roster中好友的presence状态消息,而不将自己的消息告诉对方

from:是只关心,接受对方的状态消息,而不将自己的消息告诉对方

both:即收取对方状态更新,又将自己的更新告知对方

Remove :将对方干掉,不再关心他的任何信息。

下面就先说说添加好友吧,有一点值得提一下,如果直接调用框架的createEntry()方法,在发送请求之前就已经添加了好友的花名册Roster,具体原因可以看下源码

public void createEntry(String user,String name, String[] groups) throws XMPPException {

// Create and send roster entrycreation packet.

RosterPacket rosterPacket = new RosterPacket();

rosterPacket.setType(IQ.Type.SET);

RosterPacket.Item item = new RosterPacket.Item(user,name);

if (groups !=null) {

for (String group : groups) {

if (group !=null &&group.trim().length() > 0) {

item.addGroupName(group);

}

}

}

rosterPacket.addRosterItem(item);

// Wait up to a certain number of secondsfor a reply from the server.

PacketCollector collector = connection.createPacketCollector(

newPacketIDFilter(rosterPacket.getPacketID()));

connection.sendPacket(rosterPacket);

IQ response = (IQ)collector.nextResult(SmackConfiguration.getPacketReplyTimeout());

collector.cancel();

if (response ==null) {

throw new XMPPException("No response from the server.");

}

// If the server replied with an error,throw an exception.

else if (response.getType() == IQ.Type.ERROR) {

throw new XMPPException(response.getError());

}

// Create a presence subscription packetand send.

//        Presence presencePacket =new Presence(Presence.Type.subscribe);

//       presencePacket.setTo(user);

//        connection.sendPacket(presencePacket);

} 可以看到,框架中的顺序是先添加好友,然后再发送Presence包去请求,为此框架还提供了5种subscribtion来定义双方的状态,这就和我的项目需求不和,所以在我的项目中

添加好友实现流程(同时添加)

A给B发送Presence.Type.subscribe

B收到Presence.Type.subscribe给A发送Presence.Type.subscribed(同意)

B给A发送Presence.Type.subscribe

A收到Presence.Type.subscribed调用roster.createEntry方法创建好友花名册

A收到Presence.Type.subscribe给B发送Presence.Type.subscribed(同意)

B收到Presence.Type.subcribed调用roster.createEntry方法创建好友花名册 注:源码中最后三行代码让我注释了,因为通过先用发Presence包的方法添加,这三行就没用了,但是不注释的话还是会再发一遍请求,所以果断注释掉。

以上逻辑均在PacketListener中实现,下面是我AllPacketListener类中的大概逻辑

public class AllPacketListener implements PacketListener {

//服务器返回给客户端的信息

@Override

public void processPacket(Packet packet) {

Log.i("AllPacketListener", packet.toXML());

if (packetinstanceoforg.jivesoftware.smack.packet.Presence) {//好友相关

Presencepresence = (Presence) packet;

//登陆时判断好友是否在线

if(presence.isAvailable()){

//将在线好友添加进集合

}

Type type =presence.getType();

String from =presence.getFrom();

if (type.equals(Presence.Type.subscribe)) {//好友申请

//如果已经发送过好友申请,接收到对方的好友申请,说明对方同意,直接回复同意

//如果没发送过,需要其他界面来判断是否同意

} elseif (type.equals(Presence.Type.unsubscribe)) {//删除好友

//通知当前用户被对方删除========================

} elseif (type.equals(Presence.Type.subscribed)) {//同意添加好友

//加对方为好友

//存入数据库(好友表+分组表)

//存入集合

} elseif (type.equals(Presence.Type.unsubscribed)) {//拒绝添加好友

//发通知告诉用户对方拒绝添加好友========================

} elseif (type.equals(Presence.Type.unavailable)) {//好友下线要更新好友列表,可以在这收到包后,发广播到指定页面更新列表

//更新在线好友集合

//好友头像变灰色

} elseif(type.equals(Presence.Type.available)){//好友上线

//更新在线好友集合

//好友头像变亮

}

}

}

}

上线监听好友在线状态,好友头像显示灰色或正常颜色

通过presence.isAvailable()方法判断,返回boolean类型true为在线,false为不在线,存入集合更新界面

设置自身账号状态(正常,隐身,忙碌……)

正常:Presence presence=new(Presence.Type.available);//设置状态为在线

conn.sendPacket(presence);//发送给服务器

隐身:Presence.Type.unavailable //设置状态为不在线,发送给服务器

忙碌:presence.setMode(Presence.Mode.dnd);//设置当前状态为请勿打扰,发送给服务器

或presence.setStatus(“忙碌”);//自定义状态,发送给服务器(内容可自定义)

……

用户查询

public ListsearchUser(final String username)throwsXMPPException {

searchRes = newArrayList();

UserSearchManageruserSearchManger;

try {

newServiceDiscoveryManager(GloableParams.conn);

userSearchManger= newUserSearchManager(GloableParams.conn);

Form searchForm= userSearchManger.getSearchForm("search."+SERVER_NAME);

Form answerForm= searchForm.createAnswerForm();

answerForm.setAnswer("Username",true);

answerForm.setAnswer("search", username);

ReportedDataresData = userSearchManger.getSearchResults(answerForm,"search."+conn.getServiceName());

Iteratorit = resData.getRows();

Row row = null;

SimpleUser user= null;

while (it.hasNext()) {

user = new SimpleUser();

row =it.next();

user.setUserAccount(row.getValues("Username").next().toString());

searchRes.add(user);

}

} catch (XMPPException e) {

e.printStackTrace();

}

returnsearchRes;

}

注:username不包括@服务器名

SimpleUser实体类自己定义

代码直接可用

创建好友

通过连接获得Roster类,调用roster.createEntry(String user, String name, String[] groups)方法,user好友用户名(包括@和服务器名);name好友昵称,自定义;groups好友分组,自定义

删除好友

通过roster获得RosterEntry

RosterEntry entry=roster.getEntry(user);//user包括@服务器名

调用roster.removeEntry(entry)方法删除好友

好友移动分组

通过Roster获得RosterEntry

RosterEntry entry=roster.getEntry(user);

通过Roster获得RosterGroup

RosterGroupgroup=roster.getGroup(groupName);

对group进行addEntry(entry)或removeEntry(entry)操作

实现方式,在新组中添加,在老组中删除,如果好友移动后组中没人了,下次登陆时这个组会从服务器消失,这是框架或是服务器的一种机制,无论是创建新的组或是把组里的好友全部删除或移动走后,在下次登陆时服务器会对其进行清理。解决方式,做一下判断,如果组里没人了,自动向组里添加一个好友(createEntry),但是不显示,加入其他好友后可将其删除,可以使特定的账号,如a-z,注册几个1位的账号专门占位用,以后注册时加入正则判断不让用户注册此类账号,还可以限制用户建组的数量。

好友详细信息

需要用到Vcard类实现

构建Vcard对象

Vcard vc=new Vcard();

属性赋值

vc.setFirstName(xxx);

……

保存Vcard信息

vc.save(conn);

Vcard属性:

Map homePhones

Map workPhones

Map homeAddr

Map workAddr

String firstName

String lastName

String middleName

String emailHome

String emailWork

String organization

String organizationUnit

String avatar

可以保存你需要的信息,如在middleName中保存性别

通过vc.load(conn, user)方法读取数据 //user包括@服务器名

就先这么多吧,我也在学习中,如果您有什么疑问或者更好的解决方法,欢迎指导,大家共同进步

转载请注明出处  http://blog.csdn.net/tengoku/article/details/40822561  谢谢

android xmpp 删除好友列表,android xmpp好友相关功能 添加好友 删除 移动 在线 离线 隐身 忙碌...相关推荐

  1. android 横向多级列表,Android实现横向二级菜单

    本文实例为大家分享了Android二级横向菜单的实现过程.效果如上图: 这种横向的二级菜单在很多的app都有所应用.效果看起来还是非常的美观的.也算是项目需要,自己也就学了一下这个效果,首先说一下逻辑 ...

  2. android+完美的列表,android完美讲义.pdf

    android完美讲义 王骋 QQ Phone Mail • 感谢我的同事,陈操(横拓开源技术副总),在 他提供的资料乊上做了迚一步总结提炼. • 参考资料android sdk开发文档,IBM开发者 ...

  3. android双联动列表,Android Fragment实现列表和内容联动

    在平板上经常能看到这种的情况:左边是一个列表,右边是列表项对应的内容,当点击某一个列表时,右边内容区也会随之改变.下面使用fragment简单的demo: 思路:在mainactivity定义一个回调 ...

  4. android开发评论列表,Android类Reddit循环评论列表开发

    最近因为项目需求,需要开发类似Reddit里面无限循环的评论列表,于是就开始研究其实现方式和可用性,reddit评论如下: reddit评论 从最开始的印象看,我们可以看到这是一个树状列表,如果没有限 ...

  5. android 二级折叠列表,Android折叠列表 ExpandableList

    ExpandableList 是折叠列表,通过继承ExpandableListActivity 类就可以非常简单的实现折叠列表. 效果图: 代码实现 package com.zhou.activity ...

  6. android+获取相册列表,android 获取相册列表的实现(二)

    该项目实现的功能如下: 获取手机相册,点击每个相册之后进入该相册的图片列表界面,在图片列表界面可以实现图片多选,然后进入所选择的图片界面,在该界面内可 该项目实现的功能如下: 获取手机相册,点击每个相 ...

  7. android可扩展列表,android ExpandableListView可扩展列表

    http://leiwuluan.iteye.com/blog/1508356 先看一效果图. 列表中要有 图片和文字: 所以我们要实现一个自定义的   适配器. 介绍一个类:BaseExpandab ...

  8. android 余额宝收益列表,Android 仿支付宝中的余额宝收益进度条

    一. 看效果 二.上代码 package com.framework.widget; import android.app.Activity; import android.content.Conte ...

  9. android键值列表,Android Json不规则键值解析与转换

    简述 在Android开发的时候,通过网络请求获取后台返回数据与上传数据给后台是十分常见的.有时候,我们会遇到需要解析和传递特殊键值的Json,对于这种情况,引出了本次要讲诉的内容. Json数据解析 ...

最新文章

  1. 年年有余之java求余的技巧集合
  2. Advanced Linq - Dynamic Linq query library: Add support for 'Contains' extension
  3. c盘users的用户名怎么改_iphone备份太大,严重挤占C盘空间怎么办?不用额外软件将备份放在C盘之外的教程...
  4. c语言中变量有几种存储方式,C语言变量的存储类别有哪些详细资料介绍
  5. python使用matplotlib绘制k线图
  6. Linux C函数之时间函数
  7. java子线程的创建_Java多线程基础(一):线程的创建
  8. shell :将标准输出及标准错误输出写到指定文件
  9. maya导入abc动画_如此导出ABC缓存,扩展秘籍(二)!!!
  10. 河南省第九届ACM程序设计大赛总结
  11. 恢复未保存的word
  12. vivado添加仿真源文件
  13. 高中英语语法(002)-否定
  14. ElasticSearch 一文读懂
  15. Qt version is not properly installed,please run make install
  16. 雷电网络更新:迈向 Ithaca
  17. linux创建新的虚拟环境,并安装指定版本的包
  18. R Failed to install 'unknown package' from GitHub: schannel: failed to receive handshake, SSL/TLS
  19. 大津二值化算法(Otsu)
  20. 1、去除图像中的alpha通道或透明度

热门文章

  1. Perl中chomp和chop
  2. 用2W字梳理50道计算机网络必问面试题
  3. 让沉默的大数据为人工智能插上翅膀
  4. 遭遇各种内容监管,有些企业到底欠缺的是什么,仅仅是价值观吗?
  5. 函数模型Linux系统文件I/O编程(三)---I/O多路复用
  6. 科技类论文常用(经典)单词、词组、描述汇总【高级】
  7. VBA for Excel(一)
  8. 计算机会计舞弊的现状,计算机会计舞弊现状及其对策---会计毕业论文定稿.doc...
  9. 关于Mental Ray
  10. 银行数字化转型导师坚鹏:银行同业核心产品与营销策略解读