获取状态不可用,所有名册的状态为空
Getting Presence unavailable, status null of all roster
我正在使用 asmack library 和 Openfire 服务器创建 XMPP Android 聊天客户端。
我想从我的花名册列表中获取所有花名册的存在并显示所有在线花名册,但是当我检查花名册的存在时它显示我无法访问所有花名册并且状态为空。
下面是我如何创建花名册并检查是否在场的代码?
设置状态
Presence presence = new Presence(Presence.Type.available);
presence.setStatus("I’m available");
connection.sendPacket(presence);
获取名册列表并检查是否存在
Collection<RosterEntry> entries = roster.getEntries();
Log.e("Roster Entries","Roster Entries"+entries);
//loop through
for (RosterEntry entry : entries) {
//example: get presence, type, mode, status
Presence entryPresence = roster.getPresence(entry.getUser());
Presence.Type userType = entryPresence.getType();
Presence.Mode mode = entryPresence.getMode();
String status = entryPresence.getStatus();
int state = retrieveState_mode (entryPresence.getMode() ,entryPresence.isAvailable());
Log.e("Presence Status","Presence status "+entryPresence.toString()+" type "+userType+" mode "+mode+" status "+status+" state "+state);
}
retriveState_mode()
public static int retrieveState_mode(Presence.Mode userMode, boolean isOnline) {
int userState = 0;
/** 0 for offline, 1 for online, 2 for away,3 for busy*/
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;
}
在日志中我得到这个:
Roster Entries﹕ Roster Entries[tusha: tusha, tushar: tushar]
Presence status unavailable type unavailable mode null status null state 0
Presence status unavailable type unavailable mode null status null state 0
根据我的经验,您需要先订阅用户,然后才能从 Presence 看到状态和其他信息。
例如:
用户 A 想查看用户 B 的状态和可用状态,
在这种情况下,用户A需要订阅用户B。之后用户A可以看到用户B的状态。
订阅码
try {
roster.setDefaultSubscriptionMode(Roster.SubscriptionMode.manual);
String userName = responders.getUsers().get(i).getUsername();
roster.createEntry("userB@domain", userName, null);
Presence pres = new Presence(Presence.Type.subscribe);
pres.setFrom("userA@domain");
connection.sendStanza(pres);
} catch (Exception e) {
android.util.Log.e("tag", "unable to add contact: ", e);
}
我正在使用 asmack library 和 Openfire 服务器创建 XMPP Android 聊天客户端。
我想从我的花名册列表中获取所有花名册的存在并显示所有在线花名册,但是当我检查花名册的存在时它显示我无法访问所有花名册并且状态为空。
下面是我如何创建花名册并检查是否在场的代码?
设置状态
Presence presence = new Presence(Presence.Type.available);
presence.setStatus("I’m available");
connection.sendPacket(presence);
获取名册列表并检查是否存在
Collection<RosterEntry> entries = roster.getEntries();
Log.e("Roster Entries","Roster Entries"+entries);
//loop through
for (RosterEntry entry : entries) {
//example: get presence, type, mode, status
Presence entryPresence = roster.getPresence(entry.getUser());
Presence.Type userType = entryPresence.getType();
Presence.Mode mode = entryPresence.getMode();
String status = entryPresence.getStatus();
int state = retrieveState_mode (entryPresence.getMode() ,entryPresence.isAvailable());
Log.e("Presence Status","Presence status "+entryPresence.toString()+" type "+userType+" mode "+mode+" status "+status+" state "+state);
}
retriveState_mode()
public static int retrieveState_mode(Presence.Mode userMode, boolean isOnline) {
int userState = 0;
/** 0 for offline, 1 for online, 2 for away,3 for busy*/
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;
}
在日志中我得到这个:
Roster Entries﹕ Roster Entries[tusha: tusha, tushar: tushar]
Presence status unavailable type unavailable mode null status null state 0
Presence status unavailable type unavailable mode null status null state 0
根据我的经验,您需要先订阅用户,然后才能从 Presence 看到状态和其他信息。
例如: 用户 A 想查看用户 B 的状态和可用状态, 在这种情况下,用户A需要订阅用户B。之后用户A可以看到用户B的状态。
订阅码
try {
roster.setDefaultSubscriptionMode(Roster.SubscriptionMode.manual);
String userName = responders.getUsers().get(i).getUsername();
roster.createEntry("userB@domain", userName, null);
Presence pres = new Presence(Presence.Type.subscribe);
pres.setFrom("userA@domain");
connection.sendStanza(pres);
} catch (Exception e) {
android.util.Log.e("tag", "unable to add contact: ", e);
}