Android 如何知道在线或离线的用户在一对一聊天?

Android 如何知道在线或离线的用户在一对一聊天?,android,smack,Android,Smack,我已经尝试过这段代码,但所有可用的代码片段仍然无法接收用户的在线或离线状态。请帮帮我。提前谢谢 fun checkStatus() { val jid = JidCreate.entityBareFrom("QTX69RGLVQ3VVU8QUB@localhost") var roster = Roster.getInstanceFor(connection) var availability = roster.getPresence(jid); var us

我已经尝试过这段代码,但所有可用的代码片段仍然无法接收用户的在线或离线状态。请帮帮我。提前谢谢

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

的速度收听名单和状态的变化 花名册类的典型用途是显示组和条目的树状视图以及每个条目的当前状态值。例如,请参见右侧Exodus XMPP客户端中显示花名册的图像

状态信息可能会经常更改,名册条目也可能会更改或删除。要侦听更改的排班和状态数据,应使用排班侦听器。要了解花名册的所有更改,应在登录XMPP服务器之前注册花名册列表者。下面的代码片段向花名册注册一个花名册Listener,该花名册将花名册中的任何状态更改打印到standard out。一个普通的客户端会使用类似的代码来更新花名册用户界面,以更新不断变化的信息

花名册=花名册.getInstanceFor(con);
花名册.addRosterListener(新花名册Listener(){
//已忽略事件已添加公共void entriesAdded(集合地址){}
已删除公共无效项(集合地址){}
公共无效项已更新(集合地址){}
公共无效状态已更改(状态){
System.out.println(“状态更改:“+Presence.getFrom()+”+Presence”);
}
});
请注意,为了接收状态更改事件,您需要订阅用户状态。请参阅以下部分


首先要做的事。如果你读到这篇文章:

你会发现: 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(新状态(状态.类型.可用))

您花名册订阅中的所有用户都将收到此状态信息包。 这将在

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

getPresence
是异步的,因此您必须连接事件侦听器,并且只有当服务器响应结果时,您才能know@Pierre你可以建议链接,以便我可以研究它请抱歉-这应该是可行的,它的工作。我错过了订阅,谢谢。
//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
    }
}