这是显示用户列表方面的
1. 用户列表
Smack主要使用Roster进行列表管理的
connection.getRoster();
- /**
- * 返回所有组信息 <RosterGroup>
- *
- * @return List(RosterGroup)
- */
- public static List<RosterGroup> getGroups(Roster roster) {
- List<RosterGroup> groupsList = new ArrayList<RosterGroup>();
- Collection<RosterGroup> rosterGroup = roster.getGroups();
- Iterator<RosterGroup> i = rosterGroup.iterator();
- while (i.hasNext())
- groupsList.add(i.next());
- return groupsList;
- }
- /**
- * 返回相应(groupName)组里的所有用户<RosterEntry>
- *
- * @return List(RosterEntry)
- */
- public static List<RosterEntry> getEntriesByGroup(Roster roster,
- String groupName) {
- List<RosterEntry> EntriesList = new ArrayList<RosterEntry>();
- RosterGroup rosterGroup = roster.getGroup(groupName);
- Collection<RosterEntry> rosterEntry = rosterGroup.getEntries();
- Iterator<RosterEntry> i = rosterEntry.iterator();
- while (i.hasNext())
- EntriesList.add(i.next());
- return EntriesList;
- }
- /**
- * 返回所有用户信息 <RosterEntry>
- *
- * @return List(RosterEntry)
- */
- public static List<RosterEntry> getAllEntries(Roster roster) {
- List<RosterEntry> EntriesList = new ArrayList<RosterEntry>();
- Collection<RosterEntry> rosterEntry = roster.getEntries();
- Iterator<RosterEntry> i = rosterEntry.iterator();
- while (i.hasNext())
- EntriesList.add(i.next());
- return EntriesList;
- }
这里注意下,与gtalk通讯,貌似gtalk是没有分组的,汗,所以使用第三个方法直接取
当然,还要处理,若是刚注册用户,一个组都没有的,需要默认两个组,我的好友及黑名单
黑名单的消息,一律杀掉,不会接受处理
2. 用户头像的获取
使用VCard,很强大,具体自己看API吧
可以看看VCard传回来XML的组成,含有很多信息的
- /**
- * 获取用户的vcard信息
- * @param connection
- * @param user
- * @return
- * @throws XMPPException
- */
- public static VCard getUserVCard(XMPPConnection connection, String user) throws XMPPException
- {
- VCard vcard = new VCard();
- vcard.load(connection, user);
- return vcard;
- }
- 获取头像使用
- /**
- * 获取用户头像信息
- */
- public static ImageIcon getUserImage(XMPPConnection connection, String user) {
- ImageIcon ic = null;
- try {
- System.out.println("获取用户头像信息: "+user);
- VCard vcard = new VCard();
- vcard.load(connection, user);
- if(vcard == null || vcard.getAvatar() == null)
- {
- return null;
- }
- ByteArrayInputStream bais = new ByteArrayInputStream(
- vcard.getAvatar());
- Image image = ImageIO.read(bais);
- ic = new ImageIcon(image);
- System.out.println("图片大小:"+ic.getIconHeight()+" "+ic.getIconWidth());
- } catch (Exception e) {
- e.printStackTrace();
- }
- return ic;
- }
3. 组操作和用户分组操作
主要是建立删除分组,用户添加到分组等操作
- /**
- * 添加一个组
- */
- public static boolean addGroup(Roster roster,String groupName)
- {
- try {
- roster.createGroup(groupName);
- return true;
- } catch (Exception e) {
- e.printStackTrace();
- return false;
- }
- }
- /**
- * 删除一个组
- */
- public static boolean removeGroup(Roster roster,String groupName)
- {
- return false;
- }
- /**
- * 添加一个好友 无分组
- */
- public static boolean addUser(Roster roster,String userName,String name)
- {
- try {
- roster.createEntry(userName, name, null);
- return true;
- } catch (Exception e) {
- e.printStackTrace();
- return false;
- }
- }
- /**
- * 添加一个好友到分组
- * @param roster
- * @param userName
- * @param name
- * @return
- */
- public static boolean addUser(Roster roster,String userName,String name,String groupName)
- {
- try {
- roster.createEntry(userName, name,new String[]{ groupName});
- return true;
- } catch (Exception e) {
- e.printStackTrace();
- return false;
- }
- }
- /**
- * 删除一个好友
- * @param roster
- * @param userName
- * @return
- */
- public static boolean removeUser(Roster roster,String userName)
- {
- try {
- if(userName.contains("@"))
- {
- userName = userName.split("@")[0];
- }
- RosterEntry entry = roster.getEntry(userName);
- System.out.println("删除好友:"+userName);
- System.out.println("User: "+(roster.getEntry(userName) == null));
- roster.removeEntry(entry);
- return true;
- } catch (Exception e) {
- e.printStackTrace();
- return false;
- }
- }
4. 用户查询
本来是用户操作的,分组和增删在3里讲了,这里主要是查询操作
查询用户
- public static List<UserBean> searchUsers(XMPPConnection connection,String serverDomain,String userName) throws XMPPException
- {
- List<UserBean> results = new ArrayList<UserBean>();
- System.out.println("查询开始..............."+connection.getHost()+connection.getServiceName());
- UserSearchManager usm = new UserSearchManager(connection);
- Form searchForm = usm.getSearchForm(serverDomain);
- Form answerForm = searchForm.createAnswerForm();
- answerForm.setAnswer("Username", true);
- answerForm.setAnswer("search", userName);
- ReportedData data = usm.getSearchResults(answerForm, serverDomain);
- Iterator<Row> it = data.getRows();
- Row row = null;
- UserBean user = null;
- while(it.hasNext())
- {
- user = new UserBean();
- row = it.next();
- user.setUserName(row.getValues("Username").next().toString());
- user.setName(row.getValues("Name").next().toString());
- user.setEmail(row.getValues("Email").next().toString());
- System.out.println(row.getValues("Username").next());
- System.out.println(row.getValues("Name").next());
- System.out.println(row.getValues("Email").next());
- results.add(user);
- //若存在,则有返回,UserName一定非空,其他两个若是有设,一定非空
- }
- return results;
- }
以上查询貌似是多字段查询,即用户多个属性中某一个符合即作为查询结果
实际是可以实现根据某一特定字段查询的,如用户名,或昵称,这里笼统了,若需扩展去查看下API重写下
1. 修改自身状态
包括上线,隐身,对某人隐身,对某人上线
- public static void updateStateToAvailable(XMPPConnection connection)
- {
- Presence presence = new Presence(Presence.Type.available);
- connection.sendPacket(presence);
- }
- public static void updateStateToUnAvailable(XMPPConnection connection)
- {
- Presence presence = new Presence(Presence.Type.unavailable);
- connection.sendPacket(presence);
- }
- public static void updateStateToUnAvailableToSomeone(XMPPConnection connection,String userName)
- {
- Presence presence = new Presence(Presence.Type.unavailable);
- presence.setTo(userName);
- connection.sendPacket(presence);
- }
- public static void updateStateToAvailableToSomeone(XMPPConnection connection,String userName)
- {
- Presence presence = new Presence(Presence.Type.available);
- presence.setTo(userName);
- connection.sendPacket(presence);
- }
2. 心情修改
- /**
- * 修改心情
- * @param connection
- * @param status
- */
- public static void changeStateMessage(XMPPConnection connection,String status)
- {
- Presence presence = new Presence(Presence.Type.available);
- presence.setStatus(status);
- connection.sendPacket(presence);
- }
3. 修改用户头像
有点麻烦,主要是读入图片文件,编码,传输之
- public static void changeImage(XMPPConnection connection,File f) throws XMPPException, IOException
- {
- VCard vcard = new VCard();
- vcard.load(connection);
- byte[] bytes;
- bytes = getFileBytes(f);
- String encodedImage = StringUtils.encodeBase64(bytes);
- vcard.setAvatar(bytes, encodedImage);
- vcard.setEncodedImage(encodedImage);
- vcard.setField("PHOTO", "<TYPE>image/jpg</TYPE><BINVAL>"
- + encodedImage + "</BINVAL>", true);
- ByteArrayInputStream bais = new ByteArrayInputStream(
- vcard.getAvatar());
- Image image = ImageIO.read(bais);
- ImageIcon ic = new ImageIcon(image);
- vcard.save(connection);
- }
- private static byte[] getFileBytes(File file) throws IOException {
- BufferedInputStream bis = null;
- try {
- bis = new BufferedInputStream(new FileInputStream(file));
- int bytes = (int) file.length();
- byte[] buffer = new byte[bytes];
- int readBytes = bis.read(buffer);
- if (readBytes != buffer.length) {
- throw new IOException("Entire file not read");
- }
- return buffer;
- } finally {
- if (bis != null) {
- bis.close();
- }
- }
- }
4. 补充,用户状态的监听
即对方改变头像,状态,心情时,更新自己用户列表,其实这里已经有smack实现的监听器
- final Roster roster = Client.getRoster();
- roster.addRosterListener(
- new RosterListener() {
- @Override
- public void entriesAdded(Collection<String> arg0) {
- // TODO Auto-generated method stub
- System.out.println("--------EE:"+"entriesAdded");
- }
- @Override
- public void entriesDeleted(Collection<String> arg0) {
- // TODO Auto-generated method stub
- System.out.println("--------EE:"+"entriesDeleted");
- }
- @Override
- public void entriesUpdated(Collection<String> arg0) {
- // TODO Auto-generated method stub
- System.out.println("--------EE:"+"entriesUpdated");
- }
- @Override
- public void presenceChanged(Presence arg0) {
- // TODO Auto-generated method stub
- System.out.println("--------EE:"+"presenceChanged");
- }
- });
相关推荐
xmpp协议,使用smack实现的 博文见http://blog.csdn.net/wklken/article/details/6460075
android下的XMPP对应smack-4.2.1,实现登录,注册,发单聊,加聊天室,发群聊等简单功能
android下的XMPP对应smack-4.2.1,实现登录,注册,发单聊,加聊天室,发群聊等简单功能
关于XMPP协议的smack开源框架源码分析,附带demo,注释,写的不是很好,有待完善,后期会上传
高仿android qq客户端,基于xmpp openfire smack。难得的即时通信学习源码。 介绍链接: http://blog.csdn.net/shimiso/article/details/11225873
安卓xmpp聊天之文件传输
基于XMPP 协议的Java聊天示例程序,已在本人机子上测试成功!
基于xmpp openfire smack 的即时通信客户端,高仿qq,难得的学习资源。 资源介绍:http://blog.csdn.net/shimiso/article/details/11225873
smack-im-4.2.2.jar smack-tcp-4.2.2.jar smack-extensions-4.2.2.jar smack-core-4.2.2.jar smack-android-extensions-4.2.2.jar jxmpp-jid-0.6.0.jar jxmpp-core-0.6.0.jar jxmpp-util-cache-0.6.0.jar等jar包
关于Smack编程库,前面我们提到,它是面向Java端的api,主要在PC上使用,利用它我们可以向openfire服务器注册用户,发送消息,并且可以通过监听器获得此用户的应答消息,以及构建聊天室,分组,个人通讯录等等。
Android 基于xmpp协议,smack包,openfire服务端的高仿QQ的即时通讯实现.zip
XMPP高级编程——使用JavaScript和jQuery,
下面说xmpp类的作用 XmppConnectionListerner是xmpp的连接状态的listener,比如断线等XmppMessageInterceptor是发出消息的listener,在此拦截并持久化聊天纪录XmppMessageListener是收到消息的listener,在此拦截并...
本资源是《XMPP高级编程——使用JavaScript和JQuery》一书附带的源码,十分详细,搭载在服务器上可直接运行。如果要用自己搭建的Openfire之类的XMPP服务器,修改也十分简单,是学习Web环境下的XMPP协议开发的好资料...
3.添加,删除好友 4.添加,移动好友分组 5.设置昵称 6.监控好友状态 7.网络断开系统自动重连接 8.收到添加好友请求消息处理 9.收到系统广播消息处理 10.查看历史聊天记录 11.消息弹出提醒,和小气泡 .... 因为时间...
XMPP+Openfire4.5.1+Smack4.3.4+MySql,支持手机对手机,手机对PC(Spark)的消息收发
Android 基于xmpp协议,smack包,openfire服务端的...实现了注册,登录,读取好友列表,搜索好友,添加分组,添加好友,删除好友,修改心情,两个客户端之间的信息发送与接收,监听发送来的好友申请等功能,见博客:...
android项目中打印xmpp协议(收发的报文)到日志文件,只需将代码中使用的Log.debug替换为你自己输入到日志文件的代码即可,详情见https://blog.csdn.net/w690333243/article/details/79963639
Smack是一个开源的、易于使用的XMPP客户端Java类库,提供了一套可扩展的API。
android openfire xmpp smack即时通讯,包括:聊天发生文字,表情,图片,语音。添加删除好友,消息提醒,群聊,邀请好友进入房间,聊天记录保存等等。界面美观。最后说明:此demo是在网上一个叫EIM企信通的demo基础...