首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在一对一的聊天中了解用户的在线或离线?

如何在一对一的聊天中了解用户的在线或离线?
EN

Stack Overflow用户
提问于 2019-06-19 08:09:07
回答 2查看 888关注 0票数 0

我已经尝试过这段代码,所有可用的代码段仍然无法接收到用户的在线或脱机存在。请帮帮我。提前谢谢。

代码语言:javascript
复制
fun checkStatus() {
    val jid = JidCreate.entityBareFrom("QTX69RGLVQ3VVU8QUB@localhost")

    var roster = Roster.getInstanceFor(connection)
    var availability = roster.getPresence(jid);
    var  userMode = availability.getMode();
    retrieveState_mode(userMode, availability.isAvailable)
}

fun retrieveState_mode(userMode: Presence.Mode, isOnline:Boolean):Int {
    var userState = 0;
    if(userMode == Presence.Mode.dnd) {
        userState = 3;
    } else if (userMode == Presence.Mode.away || userMode == Presence.Mode.xa) {
        userState = 2;
    } else if (isOnline) {
        userState = 1;
    }
    return userState
}

我总是能得到0

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-20 09:35:20

第一件事就是。如果你读到这个:

https://xmpp.org/extensions/xep-0162.html

您会发现:订阅=“两者”:您和联系人都对对方的存在信息感兴趣。

因此,如果您的名册设置为订户=“两者都”,则必须在彼此的名册中(例如,在两个方向上请求好友和批准)来相互听取对方的在场信息。

因此,知道以前,我使用Smack的方式是:

代码语言:javascript
复制
//Created presence packet listener
private StanzaListener presencePacketListener;

//In my connection creating
private XMPPTCPConnection createConnection() throws XmppStringprepException {
        XMPPTCPConnectionConfiguration.Builder config =  XMPPTCPConnectionConfiguration.builder();
        .......
        config.setSendPresence(true);
        .......
        return new XMPPTCPConnection(config.build());
}

//Then in login method
public void login() throws SmackInvocationException, XmppStringprepException {
        connect();
        try {
            //Add presencePacketListener to listen for subscribed users (Roster) presence
            con.addSyncStanzaListener(presencePacketListener, new StanzaTypeFilter(Presence.class));
            //Actual login
            .....
            onConnectionEstablished();
        } catch(Exception e) {          
            throw exception;
        }
}

// onConnectionEstablished method
private void onConnectionEstablished() {
        if (state != State.CONNECTED) {         
            sendPacket(new Presence(Presence.Type.available));
        }
}

做的时候

sendPacket(新存在(Presence.Type.available));

您的名册订阅中的所有用户都将收到此存在包。将在

presencePacketListener

我们在登录时已经注册了。

代码语言:javascript
复制
//PresencePacketListener
public class PresencePacketListener implements StanzaListener {
    private Context context;

    PresencePacketListener(Context context) {
        this.context = context;
    }

    @Override
    public void processStanza(Stanza packet) {
        Presence presence = (Presence)packet;
        Presence.Type presenceType = presence.getType();
        //Do sth with presence
    }
}
票数 0
EN

Stack Overflow用户

发布于 2019-06-19 08:31:41

监听名册和在场情况的变化

花名册类的典型用法是显示组和条目的树视图以及每个条目的当前存在值。例如,请参阅右侧Exodus XMPP客户端中的列表。 在场信息可能经常发生变化,也有可能更改或删除名册条目。若要侦听更改名册和在场数据,应使用RosterListener。要了解名册上的所有更改,应该在登录到XMPP服务器之前注册RosterListener。下面的代码片段向花名册注册一个RosterListener,该名册将打印名册中的任何存在更改,以使其标准化。正常客户端将使用类似的代码来根据更改的信息更新名册用户界面。

代码语言:javascript
复制
Roster roster = Roster.getInstanceFor(con);
roster.addRosterListener(new RosterListener() {
    // Ignored events public void entriesAdded(Collection<String> addresses) {}
    public void entriesDeleted(Collection<String> addresses) {}
    public void entriesUpdated(Collection<String> addresses) {}
    public void presenceChanged(Presence presence) {
        System.out.println("Presence changed: " + presence.getFrom() + " " + presence);
    }
});

注意,为了接收出现更改的事件,您需要订阅用户的存在。请参阅下一节。

来源

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56662931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档