如何通过一对一聊天知道用户在线或离线?

时间:2019-06-19 08:09:07

标签: android smack

我已经尝试过此代码,并且所有可用的代码段仍然无法接收用户的在线或离线状态。请帮我。预先感谢。

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

2 个答案:

答案 0 :(得分:0)

侦听花名册和状态变化

  

名册类的典型用法是显示组和条目的树形视图以及每个条目的当前状态值。例如,请参见右侧Exodus XMPP客户端中显示名册的图像。

     

状态信息可能会经常更改,并且名册条目也可能会更改或删除。要侦听变化的花名册和状态数据,应使用RosterListener。为了通知有关名册的所有更改,应在登录XMPP服务器之前注册RosterListener。以下代码段向Roster注册了一个RosterListener,该列表将打印出花名册中的所有状态更改以标准输出。普通客户端将使用类似的代码来使用变化的信息来更新名册用户界面。

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

请注意,为了接收状态更改事件,您需要订阅用户状态。请参阅以下部分。

Source

答案 1 :(得分:0)

第一件事。如果您阅读以下内容:

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

您会发现: subscription ='both':您和联系人对彼此的状态信息感兴趣。

因此,如果您的花名册设置为subscription ='both',则您俩都必须位于彼此的花名册中(让我们说两个方向的好友请求和批准) 互相听取出席信息。

因此,知道之前的内容,我使用Smack的方法是:

//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(new Presence(Presence.Type.available));

您的名册订阅中的所有用户将收到此状态数据包。 将会在

中处理
  

presencePacketListener

我们在登录时已经注册过

//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
    }
}