`

XMPP——Smack[3]用户列表,头像,组操作,用户操作 状态,心情,头像更改

 
阅读更多

这是显示用户列表方面的

 

1.       用户列表

Smack主要使用Roster进行列表管理的

connection.getRoster();

 

  1. /** 
  2.      * 返回所有组信息 <RosterGroup> 
  3.      *  
  4.      * @return List(RosterGroup) 
  5.      */  
  6.     public static List<RosterGroup> getGroups(Roster roster) {  
  7.         List<RosterGroup> groupsList = new ArrayList<RosterGroup>();  
  8.         Collection<RosterGroup> rosterGroup = roster.getGroups();  
  9.         Iterator<RosterGroup> i = rosterGroup.iterator();  
  10.         while (i.hasNext())  
  11.             groupsList.add(i.next());  
  12.         return groupsList;  
  13.     }  
  14.   
  15.     /** 
  16.      * 返回相应(groupName)组里的所有用户<RosterEntry> 
  17.      *  
  18.      * @return List(RosterEntry) 
  19.      */  
  20.     public static List<RosterEntry> getEntriesByGroup(Roster roster,  
  21.             String groupName) {  
  22.         List<RosterEntry> EntriesList = new ArrayList<RosterEntry>();  
  23.         RosterGroup rosterGroup = roster.getGroup(groupName);  
  24.         Collection<RosterEntry> rosterEntry = rosterGroup.getEntries();  
  25.         Iterator<RosterEntry> i = rosterEntry.iterator();  
  26.         while (i.hasNext())  
  27.             EntriesList.add(i.next());  
  28.         return EntriesList;  
  29.     }  
  30.   
  31.     /** 
  32.      * 返回所有用户信息 <RosterEntry> 
  33.      *  
  34.      * @return List(RosterEntry) 
  35.      */  
  36.     public static List<RosterEntry> getAllEntries(Roster roster) {  
  37.         List<RosterEntry> EntriesList = new ArrayList<RosterEntry>();  
  38.         Collection<RosterEntry> rosterEntry = roster.getEntries();  
  39.         Iterator<RosterEntry> i = rosterEntry.iterator();  
  40.         while (i.hasNext())  
  41.             EntriesList.add(i.next());  
  42.         return EntriesList;  
  43.     }  

 

 

这里注意下,与gtalk通讯,貌似gtalk是没有分组的,汗,所以使用第三个方法直接取

 

当然,还要处理,若是刚注册用户,一个组都没有的,需要默认两个组,我的好友及黑名单

黑名单的消息,一律杀掉,不会接受处理

2.       用户头像的获取

使用VCard,很强大,具体自己看API

可以看看VCard传回来XML的组成,含有很多信息的

 

 

  1. /** 
  2.      * 获取用户的vcard信息 
  3.      * @param connection 
  4.      * @param user 
  5.      * @return 
  6.      * @throws XMPPException 
  7.      */  
  8.     public static VCard getUserVCard(XMPPConnection connection, String user) throws XMPPException  
  9.     {  
  10.         VCard vcard = new VCard();  
  11.         vcard.load(connection, user);  
  12.           
  13.         return vcard;  
  14.     }  
  15.   
  16. 获取头像使用  
  17.     /** 
  18.      * 获取用户头像信息 
  19.      */  
  20.     public static ImageIcon getUserImage(XMPPConnection connection, String user) {  
  21.         ImageIcon ic = null;  
  22.         try {  
  23.             System.out.println("获取用户头像信息: "+user);  
  24.             VCard vcard = new VCard();  
  25.             vcard.load(connection, user);  
  26.               
  27.             if(vcard == null || vcard.getAvatar() == null)  
  28.             {  
  29.                 return null;  
  30.             }  
  31.             ByteArrayInputStream bais = new ByteArrayInputStream(  
  32.                     vcard.getAvatar());  
  33.             Image image = ImageIO.read(bais);  
  34.       
  35.               
  36.             ic = new ImageIcon(image);  
  37.             System.out.println("图片大小:"+ic.getIconHeight()+" "+ic.getIconWidth());  
  38.           
  39.         } catch (Exception e) {  
  40.             e.printStackTrace();  
  41.         }  
  42.         return ic;  
  43.     }  

  

 

 

3.       组操作和用户分组操作

主要是建立删除分组,用户添加到分组等操作

 

 

 

[c-sharp] view plaincopyprint?
 
  1. /** 
  2.      * 添加一个组 
  3.      */  
  4.     public static boolean addGroup(Roster roster,String groupName)  
  5.     {  
  6.         try {  
  7.             roster.createGroup(groupName);  
  8.             return true;  
  9.         } catch (Exception e) {  
  10.             e.printStackTrace();  
  11.             return false;  
  12.         }  
  13.     }  
  14.       
  15.     /** 
  16.      * 删除一个组 
  17.      */  
  18.     public static boolean removeGroup(Roster roster,String groupName)  
  19.     {  
  20.         return false;  
  21.     }  
  22.       
  23.     /** 
  24.      * 添加一个好友  无分组 
  25.      */  
  26.     public static boolean addUser(Roster roster,String userName,String name)  
  27.     {  
  28.         try {  
  29.             roster.createEntry(userName, name, null);  
  30.             return true;  
  31.         } catch (Exception e) {  
  32.             e.printStackTrace();  
  33.             return false;  
  34.         }  
  35.     }  
  36.     /** 
  37.      * 添加一个好友到分组 
  38.      * @param roster 
  39.      * @param userName 
  40.      * @param name 
  41.      * @return 
  42.      */  
  43.     public static boolean addUser(Roster roster,String userName,String name,String groupName)  
  44.     {  
  45.         try {  
  46.             roster.createEntry(userName, name,new String[]{ groupName});  
  47.             return true;  
  48.         } catch (Exception e) {  
  49.             e.printStackTrace();  
  50.             return false;  
  51.         }  
  52.     }  
  53.       
  54.     /** 
  55.      * 删除一个好友 
  56.      * @param roster 
  57.      * @param userName 
  58.      * @return 
  59.      */  
  60.     public static boolean removeUser(Roster roster,String userName)  
  61.     {  
  62.         try {  
  63.               
  64.             if(userName.contains("@"))  
  65.             {  
  66.                 userName = userName.split("@")[0];  
  67.             }  
  68.             RosterEntry entry = roster.getEntry(userName);  
  69.             System.out.println("删除好友:"+userName);  
  70.             System.out.println("User: "+(roster.getEntry(userName) == null));  
  71.             roster.removeEntry(entry);  
  72.               
  73.             return true;  
  74.         } catch (Exception e) {  
  75.             e.printStackTrace();  
  76.             return false;  
  77.         }  
  78.           
  79.     }  

  

 

 

4.     用户查询

本来是用户操作的,分组和增删在3里讲了,这里主要是查询操作

查询用户

 

  1. public static List<UserBean> searchUsers(XMPPConnection connection,String serverDomain,String userName) throws XMPPException  
  2.     {  
  3.         List<UserBean> results = new ArrayList<UserBean>();  
  4.         System.out.println("查询开始..............."+connection.getHost()+connection.getServiceName());  
  5.           
  6.         UserSearchManager usm = new UserSearchManager(connection);  
  7.           
  8.           
  9.         Form searchForm = usm.getSearchForm(serverDomain);  
  10.         Form answerForm = searchForm.createAnswerForm();  
  11.         answerForm.setAnswer("Username"true);  
  12.         answerForm.setAnswer("search", userName);  
  13.         ReportedData data = usm.getSearchResults(answerForm, serverDomain);  
  14.            
  15.          Iterator<Row> it = data.getRows();  
  16.          Row row = null;  
  17.          UserBean user = null;  
  18.          while(it.hasNext())  
  19.          {  
  20.              user = new UserBean();  
  21.              row = it.next();  
  22.              user.setUserName(row.getValues("Username").next().toString());  
  23.              user.setName(row.getValues("Name").next().toString());  
  24.              user.setEmail(row.getValues("Email").next().toString());  
  25.              System.out.println(row.getValues("Username").next());  
  26.              System.out.println(row.getValues("Name").next());  
  27.              System.out.println(row.getValues("Email").next());  
  28.              results.add(user);  
  29.              //若存在,则有返回,UserName一定非空,其他两个若是有设,一定非空  
  30.          }  
  31.            
  32.          return results;  
  33.     }  

 

 

 

以上查询貌似是多字段查询,即用户多个属性中某一个符合即作为查询结果

实际是可以实现根据某一特定字段查询的,如用户名,或昵称,这里笼统了,若需扩展去查看下API重写下

 1.       修改自身状态

包括上线,隐身,对某人隐身,对某人上线

 

  1. public static void updateStateToAvailable(XMPPConnection connection)  
  2.     {  
  3.         Presence presence = new Presence(Presence.Type.available);  
  4.         connection.sendPacket(presence);  
  5.      }  
  6.       
  7.     public static void updateStateToUnAvailable(XMPPConnection connection)  
  8.     {  
  9.         Presence presence = new Presence(Presence.Type.unavailable);  
  10.         connection.sendPacket(presence);  
  11.         }  
  12.       
  13.     public static void updateStateToUnAvailableToSomeone(XMPPConnection connection,String userName)  
  14.     {  
  15.         Presence presence = new Presence(Presence.Type.unavailable);  
  16.         presence.setTo(userName);  
  17.         connection.sendPacket(presence);  
  18.     }  
  19.     public static void updateStateToAvailableToSomeone(XMPPConnection connection,String userName)  
  20.     {  
  21.         Presence presence = new Presence(Presence.Type.available);  
  22.         presence.setTo(userName);  
  23.         connection.sendPacket(presence);  
  24.   
  25.     }  

 

 

2.       心情修改

 

  

  1. /** 
  2.      * 修改心情 
  3.      * @param connection 
  4.      * @param status 
  5.      */  
  6.     public static void changeStateMessage(XMPPConnection connection,String status)  
  7.     {  
  8.         Presence presence = new Presence(Presence.Type.available);  
  9.         presence.setStatus(status);  
  10.         connection.sendPacket(presence);  
  11.       
  12.     }  

 

 

3.       修改用户头像

有点麻烦,主要是读入图片文件,编码,传输之

 

 

  1. public static void changeImage(XMPPConnection connection,File f) throws XMPPException, IOException  
  2.     {  
  3.       
  4.         VCard vcard = new VCard();  
  5.         vcard.load(connection);  
  6.           
  7.             byte[] bytes;  
  8.             
  9.                 bytes = getFileBytes(f);  
  10.                 String encodedImage = StringUtils.encodeBase64(bytes);  
  11.                 vcard.setAvatar(bytes, encodedImage);  
  12.                 vcard.setEncodedImage(encodedImage);  
  13.                 vcard.setField("PHOTO""<TYPE>image/jpg</TYPE><BINVAL>"  
  14.                         + encodedImage + "</BINVAL>"true);  
  15.                   
  16.                   
  17.                 ByteArrayInputStream bais = new ByteArrayInputStream(  
  18.                         vcard.getAvatar());  
  19.                 Image image = ImageIO.read(bais);  
  20.                 ImageIcon ic = new ImageIcon(image);  
  21.                    
  22.              
  23.             
  24.             vcard.save(connection);  
  25.              
  26.     }  
  27.       
  28.     private static byte[] getFileBytes(File file) throws IOException {  
  29.         BufferedInputStream bis = null;  
  30.         try {  
  31.             bis = new BufferedInputStream(new FileInputStream(file));  
  32.             int bytes = (int) file.length();  
  33.             byte[] buffer = new byte[bytes];  
  34.             int readBytes = bis.read(buffer);  
  35.             if (readBytes != buffer.length) {  
  36.                 throw new IOException("Entire file not read");  
  37.             }  
  38.             return buffer;  
  39.         } finally {  
  40.             if (bis != null) {  
  41.                 bis.close();  
  42.             }  
  43.         }  
  44. }  

 

 

4.  补充,用户状态的监听

 

即对方改变头像,状态,心情时,更新自己用户列表,其实这里已经有smack实现的监听器

 

 

 

 

 

 

 

 

  1. final Roster roster = Client.getRoster();  
  2.           
  3.         roster.addRosterListener(  
  4.                 new RosterListener() {  
  5.   
  6.                     @Override  
  7.                     public void entriesAdded(Collection<String> arg0) {  
  8.                         // TODO Auto-generated method stub  
  9.                         System.out.println("--------EE:"+"entriesAdded");  
  10.                     }  
  11.   
  12.                     @Override  
  13.                     public void entriesDeleted(Collection<String> arg0) {  
  14.                         // TODO Auto-generated method stub  
  15.                         System.out.println("--------EE:"+"entriesDeleted");  
  16.                     }  
  17.   
  18.                     @Override  
  19.                     public void entriesUpdated(Collection<String> arg0) {  
  20.                         // TODO Auto-generated method stub  
  21.                         System.out.println("--------EE:"+"entriesUpdated");  
  22.                     }  
  23.   
  24.                     @Override  
  25.                     public void presenceChanged(Presence arg0) {  
  26.                         // TODO Auto-generated method stub  
  27.                         System.out.println("--------EE:"+"presenceChanged");  
  28.                     }     
  29.                       
  30.                 });  
  31.               

 

 

 

 

分享到:
评论

相关推荐

    xmpp——Smack的IM实现

    在实现XMPP即时通讯时,首先需要了解XMPP的基本概念,如JID(Jabber ID)用于标识用户,以及IQ(Information Query)、Presence和Message作为XMPP的核心元素,分别用于获取信息、报告在线状态和发送消息。...

    android下的XMPP对应smack-4.2.1,实现登录,注册,发单聊,加聊天室,发群聊等简单功能

    在这个项目中,我们利用Smack-4.2.1库来实现在Android上使用XMPP进行各种交互,如登录、注册、发送单聊消息、加入聊天室和发送群聊消息等基本功能。 首先,我们需要了解Smack-4.2.1。Smack是一个开源的Java库,专门...

    XMPP Smack java 聊天程序

    XMPP(Extensible Messaging and Presence Protocol)是一种开放的即时通讯协议,它允许用户进行实时通信,包括文字聊天、语音视频通话、文件传输等。Smack是XMPP的一个Java实现库,它为开发者提供了简单易用的API,...

    XMPP_Smack_Demo_Source

    3. **实体管理**:在XMPP中,每个用户或服务都是一个实体,通常表示为JID(Jabber ID)。Smack提供了`XMPPConnection`接口,用于管理这些实体,包括创建、修改和删除。 4. **聊天功能**:源码中应该包含一对一私聊...

    安卓xmpp通讯之smack4.1.9

    Smack的Roster类用于处理好友列表,Presence类则用于管理在线状态和展示信息。 3. **消息传递**:Smack提供了Message类,用于构建和解析文本、多媒体等不同类型的消息。聊天功能的核心就是发送和接收Message对象。 ...

    xmpp实现smack登录,注册,聊天功能

    android下的XMPP对应smack-4.2.1,实现登录,注册,发单聊,加聊天室,发群聊等简单功能

    基于xmpp_openfire_smack开发之smack类库介绍和使用

    除了基本的聊天功能,Smack 还支持更复杂的特性,如多用户聊天(MUC,也称为群聊)、服务发现、文件传输、隐私列表和扩展自定义数据包。例如,你可以创建聊天室,加入和离开聊天室,发送和接收文件,甚至可以实现...

    Android 基于xmpp协议,smack包,openfire服务端的高仿QQ的即时通讯实现.zip

    这涉及到使用Android的布局和控件,设计消息气泡、在线状态图标、头像显示、聊天界面等,同时要保证良好的用户体验和性能优化。 6. **安全性和性能**:在开发过程中,必须考虑安全问题,如数据加密、防止XSS和SQL...

    高仿android qq客户端 基于xmpp openfire smack

    高仿android qq客户端,基于xmpp openfire smack。难得的即时通信学习源码。 介绍链接: http://blog.csdn.net/shimiso/article/details/11225873

    即时通信源码 高仿android qq客户端 基于xmpp openfire smack.

    基于xmpp openfire smack 的即时通信客户端,高仿qq,难得的学习资源。 资源介绍:http://blog.csdn.net/shimiso/article/details/11225873

    XMPP客户端Java类库:Smack

    3. **实体管理**:Smack可以创建、修改和删除XMPP实体,如用户、群组、多用户聊天室等。 4. **消息传递**:支持发送和接收文本、HTML、文件等不同类型的消息,同时提供群聊和私聊功能。 5. ** Presence管理**:处理...

    XMPP高级编程——使用JavaScript和jQuery

    1. **DOM操作**:jQuery简化了元素选择、遍历和操作,使得在XML文档中查找和修改XMPP节点变得更加直观。 2. **AJAX**:jQuery封装了XMLHttpRequest,提供了一套更简洁的API进行异步请求,对XMPP的XML数据交换很有...

    最全xmpp开发smack 4.2.2所需jar包

    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包

    XMPP高级编程——使用JavaScript和jQuery.pdf

    ### XMPP高级编程——使用JavaScript和jQuery #### 一、XMPP协议概述 **XMPP**(eXtensible Messaging and Presence Protocol,可扩展消息处理现场协议)作为一种灵活且功能强大的协议,其核心在于提供一种机制,让...

    xmpp聊天添加好友用户查询

    在XMPP聊天项目中,Smack库用于实现客户端的XMPP功能,包括登录、发送和接收消息、添加好友、查询用户等操作。 3. **添加好友功能**: - 在XMPP中,添加好友的过程通常涉及到发送一个"订阅请求"(subscribe)给...

    smack源码,3.2版本的,基于xmpp的即时通讯客户端

    **Smack源码详解——基于XMPP的即时通讯客户端** Smack是一款开源的Java库,专为实现基于XMPP(Extensible Messaging and Presence Protocol)的即时通讯应用而设计。XMPP是一种开放标准,广泛用于创建实时通信系统...

    xmpp webrtc

    XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的开放标准通信协议,主要用于即时消息、在线状态管理和多媒体通信。在WebRTC(Web Real-Time Communication)技术中,XMPP被用作信令协议,负责...

    android studio基于XMPP,Openfire,Smack聊天demo

    Smack提供了连接Openfire或其他XMPP服务器、发送和接收消息、管理用户状态以及进行多用户聊天的能力。在Android Studio的项目中,Smack库是连接Openfire服务器并实现聊天功能的关键组件。 **Android Studio:** ...

    android(kotlin版本)下的XMPP对应smack-4.2.1,实现登录,注册,发单聊,加聊天室,发群聊等简单功能

    直接当一个model导入.入口是startActivity(new Intent(this, com.xmpp.xmppchat.LoginActivity.class));.要重新修改IP和端口号,比之前的JAVA版本,实现了语音和照片拍照等功能

    smack4.1.5 实现xmpp 所需要的所有jar

    XMPP是一种基于XML的实时通信协议,广泛用于即时通讯、在线状态管理和多用户聊天等场景。在Java应用中,Smack库提供了一套完整的API,使开发者能够轻松地构建XMPP客户端和服务端应用。 Smack 4.1.5 版本包含了多个...

Global site tag (gtag.js) - Google Analytics