如何在android上使用smack 4.3.5检索用户的真实姓名?

问题描述

在将用户添加到我的花名册之前,我需要检索用户的真实姓名,但我还没有找到任何方法来做到这一点。你们中的一些人可能会建议我在将用户添加到我的花名册之前获取用户的真实姓名。

enter image description here

   roster.addSubscribeListener((from,subscribeRequest) -> {

         //Here I need to get the real name of the user.
    
        return SubscribeListener.SubscribeAnswer.ApproveAndAlsoRequestIfrequired;
    });

解决方法

用于在 smack 中检索用户的真实姓名,以便您必须使用 Vcard (https://xmpp.org/extensions/xep-0054.html) 管理名称。 vCard 是一种现有且广泛使用的个人用户信息存储标准,有点像电子名片。

下面使用XMPP连接保存Vcard的代码

fun updateVCard(firstName: String,lastName: String) {
    val vCardManager: VCardManager = VCardManager.getInstanceFor(connection)
    val vCard = VCard()

    vCard.firstName = firstName
    vCard.lastName = lastName
    vCard.setField("FN",firstName)

    try {
        vCardManager.saveVCard(vCard)
        Log.e("updateVCard","updateVCard: update success")
    } catch (e: Exception) {
        e.printStackTrace()
        Log.e("updateVCard","updateVCard: error " + e.message)
    }

}

现在此代码用于获取存储在服务器 Vcard 中的用户详细信息

val vCard = getUserDetail(jid); val username = vCard?.getField("FN") + " " + vCard?.lastName

fun getUserDetail(JID: String): VCard? {
    var jid: EntityBareJid? = null
    var vCard: VCard? = null
    try {
        jid = JidCreate.entityBareFrom(JID)
        vCard = VCardManager.getInstanceFor(connection).loadVCard(jid) as VCard
    } catch (e: java.lang.Exception) {
        e.printStackTrace()
    }
    return vCard
}