Smack[3]用户列表,头像,组操作,用户操作

时间:2022-03-15 23:20:54
    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. * 返回相应(groupName)组里的所有用户<RosterEntry>
    16. *
    17. * @return List(RosterEntry)
    18. */
    19. public static List<RosterEntry> getEntriesByGroup(Roster roster,
    20. String groupName) {
    21. List<RosterEntry> EntriesList = new ArrayList<RosterEntry>();
    22. RosterGroup rosterGroup = roster.getGroup(groupName);
    23. Collection<RosterEntry> rosterEntry = rosterGroup.getEntries();
    24. Iterator<RosterEntry> i = rosterEntry.iterator();
    25. while (i.hasNext())
    26. EntriesList.add(i.next());
    27. return EntriesList;
    28. }
    29. /**
    30. * 返回所有用户信息 <RosterEntry>
    31. *
    32. * @return List(RosterEntry)
    33. */
    34. public static List<RosterEntry> getAllEntries(Roster roster) {
    35. List<RosterEntry> EntriesList = new ArrayList<RosterEntry>();
    36. Collection<RosterEntry> rosterEntry = roster.getEntries();
    37. Iterator<RosterEntry> i = rosterEntry.iterator();
    38. while (i.hasNext())
    39. EntriesList.add(i.next());
    40. return EntriesList;
    41. }

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

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

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

    1. 用户头像的获取

    使用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. return vcard;
    13. }
    14. 获取头像使用
    15. /**
    16. * 获取用户头像信息
    17. */
    18. public static ImageIcon getUserImage(XMPPConnection connection, String user) {
    19. ImageIcon ic = null;
    20. try {
    21. System.out.println("获取用户头像信息: "+user);
    22. VCard vcard = new VCard();
    23. vcard.load(connection, user);
    24. if(vcard == null || vcard.getAvatar() == null)
    25. {
    26. return null;
    27. }
    28. ByteArrayInputStream bais = new ByteArrayInputStream(
    29. vcard.getAvatar());
    30. Image image = ImageIO.read(bais);
    31. ic = new ImageIcon(image);
    32. System.out.println("图片大小:"+ic.getIconHeight()+" "+ic.getIconWidth());
    33. } catch (Exception e) {
    34. e.printStackTrace();
    35. }
    36. return ic;
    37. }
    1. 组操作和用户分组操作

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

    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. public static boolean removeGroup(Roster roster,String groupName)
    18. {
    19. return false;
    20. }
    21. /**
    22. * 添加一个好友  无分组
    23. */
    24. public static boolean addUser(Roster roster,String userName,String name)
    25. {
    26. try {
    27. roster.createEntry(userName, name, null);
    28. return true;
    29. } catch (Exception e) {
    30. e.printStackTrace();
    31. return false;
    32. }
    33. }
    34. /**
    35. * 添加一个好友到分组
    36. * @param roster
    37. * @param userName
    38. * @param name
    39. * @return
    40. */
    41. public static boolean addUser(Roster roster,String userName,String name,String groupName)
    42. {
    43. try {
    44. roster.createEntry(userName, name,new String[]{ groupName});
    45. return true;
    46. } catch (Exception e) {
    47. e.printStackTrace();
    48. return false;
    49. }
    50. }
    51. /**
    52. * 删除一个好友
    53. * @param roster
    54. * @param userName
    55. * @return
    56. */
    57. public static boolean removeUser(Roster roster,String userName)
    58. {
    59. try {
    60. if(userName.contains("@"))
    61. {
    62. userName = userName.split("@")[0];
    63. }
    64. RosterEntry entry = roster.getEntry(userName);
    65. System.out.println("删除好友:"+userName);
    66. System.out.println("User: "+(roster.getEntry(userName) == null));
    67. roster.removeEntry(entry);
    68. return true;
    69. } catch (Exception e) {
    70. e.printStackTrace();
    71. return false;
    72. }
    73. }
    1. 用户查询

    本来是用户操作的,分组和增删在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. UserSearchManager usm = new UserSearchManager(connection);
    6. Form searchForm = usm.getSearchForm(serverDomain);
    7. Form answerForm = searchForm.createAnswerForm();
    8. answerForm.setAnswer("Username", true);
    9. answerForm.setAnswer("search", userName);
    10. ReportedData data = usm.getSearchResults(answerForm, serverDomain);
    11. Iterator<Row> it = data.getRows();
    12. Row row = null;
    13. UserBean user = null;
    14. while(it.hasNext())
    15. {
    16. user = new UserBean();
    17. row = it.next();
    18. user.setUserName(row.getValues("Username").next().toString());
    19. user.setName(row.getValues("Name").next().toString());
    20. user.setEmail(row.getValues("Email").next().toString());
    21. System.out.println(row.getValues("Username").next());
    22. System.out.println(row.getValues("Name").next());
    23. System.out.println(row.getValues("Email").next());
    24. results.add(user);
    25. //若存在,则有返回,UserName一定非空,其他两个若是有设,一定非空
    26. }
    27. return results;
    28. }