如何在smack XMPP服务器中为UserSearchManager添加搜索服务?

时间:2018-02-08 04:32:59

标签: android xmpp chat ejabberd smack

  

环境:

     
      
  • Ejabberd版本:16.04
  •   
  • 的Smack-机器人-4.1.0
  •   

我正在尝试创建一个聊天应用程序,它具有按名称,年龄等搜索可用用户的功能。但是,当我使用下面的代码时,服务器在服务器中没有任何搜索服务

public void serachServiceList() {

    try {
        UserSearchManager searchManager = new UserSearchManager(connection);
        List<String> services = searchManager.getSearchServices();

        if (services == null || services.size() < 1) {
            System.out.println("No services");
        } else {
            for (String service : services) {
                Log.e("SERVICE", service);
            }

        }
    } catch (SmackException.NoResponseException | XMPPException.XMPPErrorException | SmackException.NotConnectedException e) {
        e.printStackTrace();
    }
}

XMPP服务器中是否有默认搜索服务?我是否必须单独安装搜索服务?我搜索但我找不到任何搜索插件为smack。 很高兴听到您的解决方案/想法。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

我也开发了相同的功能,但我使用VCard来搜索用户而不是SearchManager。

首先需要添加all contact in roster并使用vcard,您可以获取或设置用户头像,设置用户状态,存储用户状态,如whatsapp等,使用JID搜索用户等< / p>

以下是来自Vcard的代码搜索用户

搜索用户():

public UserProfile search(String jid) throws SmackInvocationException {


    if (vCardHelper == null) {
        return null;
    }

    VCard vCard = vCardHelper.loadVCard(jid);
    String nickname = vCard.getNickName();

    return nickname == null ? null : new UserProfile(jid, vCard);
}
  

UserProfile是一个模型类,其中包含以下带有garter setter

的值
private String nickname;
private String jid;
private String status;
private byte[] avatar;

<强> getNickName():

public String getNickname(String jid) throws SmackInvocationException {
        VCard vCard = vCardHelper.loadVCard(jid);

        return vCard.getNickName();
    }

<强> loadVCard():

public VCard loadVCard(String jid) throws SmackInvocationException {
    VCard vCard = new VCard();
    try {
        vCard.load(con, jid);

        return vCard;
    } catch (Exception e) {
        throw new SmackInvocationException(e);
    }
}

以下代码从服务器获取搜索用户的列表

  

- 我在这里看到了一个简单的例子,我创建了AsyncTask这个   任务放在doInBackground

try {
    UserProfile user = SmackHelper.getInstance(context).search(username);
    if (user != null) {
        if (user.getUserName().equals(PreferenceUtils.getUser(context))) {
            user.setType(UserProfile.TYPE_MYSELF);
        } else {
            Cursor c = context.getContentResolver().query(ContactTable.CONTENT_URI, new String[]{ContactTable._ID},
                    ContactTable.COLUMN_NAME_JID + " = ?", new String[] {user.getJid()}, null);
            if (c.moveToFirst()) {
                user.setType(UserProfile.TYPE_CONTACT);
            } else {
                user.setType(UserProfile.TYPE_NOT_CONTACT);
            }
        }
    }

    return Response.success(user);
} catch(SmackInvocationException e) {
     Log.e(String.format("search user error %s", e.toString()), e);

    return Response.error(e);
}