我已经尝试过这段代码,所有可用的代码段仍然无法接收到用户的在线或脱机存在。请帮帮我。提前谢谢。
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
发布于 2019-06-20 09:35:20
第一件事就是。如果你读到这个:
https://xmpp.org/extensions/xep-0162.html
您会发现:订阅=“两者”:您和联系人都对对方的存在信息感兴趣。
因此,如果您的名册设置为订户=“两者都”,则必须在彼此的名册中(例如,在两个方向上请求好友和批准)来相互听取对方的在场信息。
因此,知道以前,我使用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(新存在(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
}
}发布于 2019-06-19 08:31:41
监听名册和在场情况的变化
花名册类的典型用法是显示组和条目的树视图以及每个条目的当前存在值。例如,请参阅右侧Exodus XMPP客户端中的列表。 在场信息可能经常发生变化,也有可能更改或删除名册条目。若要侦听更改名册和在场数据,应使用RosterListener。要了解名册上的所有更改,应该在登录到XMPP服务器之前注册RosterListener。下面的代码片段向花名册注册一个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);
}
});注意,为了接收出现更改的事件,您需要订阅用户的存在。请参阅下一节。
https://stackoverflow.com/questions/56662931
复制相似问题