android xmpp 删除好友列表,android xmpp好友相关功能 添加好友 删除 移动 在线 离线 隐身 忙碌...
最近在写一个即时通信的项目,用的也是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好友相关功能 添加好友 删除 移动 在线 离线 隐身 忙碌...相关推荐
- android 横向多级列表,Android实现横向二级菜单
本文实例为大家分享了Android二级横向菜单的实现过程.效果如上图: 这种横向的二级菜单在很多的app都有所应用.效果看起来还是非常的美观的.也算是项目需要,自己也就学了一下这个效果,首先说一下逻辑 ...
- android+完美的列表,android完美讲义.pdf
android完美讲义 王骋 QQ Phone Mail • 感谢我的同事,陈操(横拓开源技术副总),在 他提供的资料乊上做了迚一步总结提炼. • 参考资料android sdk开发文档,IBM开发者 ...
- android双联动列表,Android Fragment实现列表和内容联动
在平板上经常能看到这种的情况:左边是一个列表,右边是列表项对应的内容,当点击某一个列表时,右边内容区也会随之改变.下面使用fragment简单的demo: 思路:在mainactivity定义一个回调 ...
- android开发评论列表,Android类Reddit循环评论列表开发
最近因为项目需求,需要开发类似Reddit里面无限循环的评论列表,于是就开始研究其实现方式和可用性,reddit评论如下: reddit评论 从最开始的印象看,我们可以看到这是一个树状列表,如果没有限 ...
- android 二级折叠列表,Android折叠列表 ExpandableList
ExpandableList 是折叠列表,通过继承ExpandableListActivity 类就可以非常简单的实现折叠列表. 效果图: 代码实现 package com.zhou.activity ...
- android+获取相册列表,android 获取相册列表的实现(二)
该项目实现的功能如下: 获取手机相册,点击每个相册之后进入该相册的图片列表界面,在图片列表界面可以实现图片多选,然后进入所选择的图片界面,在该界面内可 该项目实现的功能如下: 获取手机相册,点击每个相 ...
- android可扩展列表,android ExpandableListView可扩展列表
http://leiwuluan.iteye.com/blog/1508356 先看一效果图. 列表中要有 图片和文字: 所以我们要实现一个自定义的 适配器. 介绍一个类:BaseExpandab ...
- android 余额宝收益列表,Android 仿支付宝中的余额宝收益进度条
一. 看效果 二.上代码 package com.framework.widget; import android.app.Activity; import android.content.Conte ...
- android键值列表,Android Json不规则键值解析与转换
简述 在Android开发的时候,通过网络请求获取后台返回数据与上传数据给后台是十分常见的.有时候,我们会遇到需要解析和传递特殊键值的Json,对于这种情况,引出了本次要讲诉的内容. Json数据解析 ...
最新文章
- 年年有余之java求余的技巧集合
- Advanced Linq - Dynamic Linq query library: Add support for 'Contains' extension
- c盘users的用户名怎么改_iphone备份太大,严重挤占C盘空间怎么办?不用额外软件将备份放在C盘之外的教程...
- c语言中变量有几种存储方式,C语言变量的存储类别有哪些详细资料介绍
- python使用matplotlib绘制k线图
- Linux C函数之时间函数
- java子线程的创建_Java多线程基础(一):线程的创建
- shell :将标准输出及标准错误输出写到指定文件
- maya导入abc动画_如此导出ABC缓存,扩展秘籍(二)!!!
- 河南省第九届ACM程序设计大赛总结
- 恢复未保存的word
- vivado添加仿真源文件
- 高中英语语法(002)-否定
- ElasticSearch 一文读懂
- Qt version is not properly installed,please run make install
- 雷电网络更新:迈向 Ithaca
- linux创建新的虚拟环境,并安装指定版本的包
- R Failed to install 'unknown package' from GitHub: schannel: failed to receive handshake, SSL/TLS
- 大津二值化算法(Otsu)
- 1、去除图像中的alpha通道或透明度