【问题标题】:How to add a search service for UserSearchManager in smack XMPP server?如何在 smack XMPP 服务器中为 UserSearchManager 添加搜索服务?
【发布时间】:2018-07-18 13:21:26
【问题描述】:

环境:

  • Ejabberd 版本:16.04
  • Smack-android-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 的搜索插件。 很高兴听到您对此的解决方案/想法。 提前致谢。

【问题讨论】:

    标签: android xmpp chat ejabberd smack


    【解决方案1】:

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

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

    这是我的 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 是一个模型类,它包含以下带有吊袜带设置器的值

    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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-24
      • 2014-09-17
      • 1970-01-01
      • 2015-07-15
      • 1970-01-01
      • 1970-01-01
      • 2014-10-12
      • 2020-10-22
      相关资源
      最近更新 更多