【问题标题】:Getting Presence unavailable, status null of all roster获得状态不可用,所有名册的状态为空
【发布时间】:2015-10-13 08:15:06
【问题描述】:

我正在使用 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

【问题讨论】:

    标签: android xmpp asmack


    【解决方案1】:

    根据我的经验,您需要订阅用户才能从 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);
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多