【问题标题】:XMPP aSmack - How can I get the current user state (offline/online/away/etc.)?XMPP aSmack - 如何获取当前用户状态(离线/在线/离开/等)?
【发布时间】:2013-01-05 08:39:22
【问题描述】:

我是 android 中 xmpp/asmack 的新手。

任何人都可以帮助我获得用户的朋友(花名册)的存在

我正在使用这个:

Presence availability = roster.getPresence(user);
Mode userMode = availability.getMode();

我还应该做些什么来获取我的名册中列出的每个用户的可用性状态。

【问题讨论】:

    标签: android xmpp smack asmack


    【解决方案1】:

    就这样使用吧:

    Presence availability = roster.getPresence(user);
    Mode userMode = availability.getMode();
    
    retrieveState_mode(availability.getMode(),availability.isAvailable());
    
    public static int retrieveState_mode(Mode userMode, boolean isOnline) {
            int userState = 0;
            /** 0 for offline, 1 for online, 2 for away,3 for busy*/
            if(userMode == Mode.dnd) {
                userState = 3;
            } else if (userMode == Mode.away || userMode == Mode.xa) {   
                userState = 2;
            } else if (isOnline) {
                userState = 1;
            }
            return userState;
    }
    

    如果您对 xmpp/asmack 有任何问题,请告诉我

    【讨论】:

    • 我试过这段代码,但每次我得到 0(离线),甚至用户状态都是在线的!请给我建议。
    • @RahulUpadhyay 你能把你的代码给我看看吗,我可以调查一下。
    • 嗨 @samsad 我无法让用户在场,我们需要为此启用任何设置吗??
    • @KK_07k11A0585 请分享您的代码 sn-p 并解释您遇到的错误,然后我可以帮助您
    • 嗨@GauravArora请看这个pastebin.com/j113RzV6我总是把用户模式设为0。如果我遗漏了什么,请告诉我..
    【解决方案2】:

    这样使用

    userFromServer = con.getRoster().getPresence(userID);
    userState = retrieveState(userFromServer.getMode(), userFromServer.isAvailable());
    
    public int retrieveState(Mode userMode, boolean isOnline) {
        int userState = XmppFriend.OFFLINE; // default return value
        if (userMode == Mode.dnd) {
            userState = XmppFriend.BUSY;
        } else if (userMode == Mode.away || userMode == Mode.xa) {
            userState = XmppFriend.AWAY;
        } else if (isOnline) {
            userState = XmppFriend.ONLINE;
        }
        return userState;
    }
    

    【讨论】:

      【解决方案3】:
              roster.addRosterListener(new RosterListener() {
      
              public void entriesAdded(Collection<String> param) {}
      
              public void entriesDeleted(Collection<String> addresses) {
              }
              public void entriesUpdated(Collection<String> addresses) {  
              }
              public void presenceChanged(Presence presence) {
      
                  String user = presence.getFrom();
                  Presence bestPresence = roster.getPresence(user);
      
                  Log.d(TAG, "BestPresence: " + user + ": " + bestPresence);
      
                  String[] temp = presence.getFrom().split("\\@");
                  Log.d(TAG, "Presence: " + temp[0] + "-" + presence.toString());
      
                  String status = presence.toString();
                  // ShowInfoDialog(temp[0]+"is "+status);
      
                  for (int i = 0; i < friendslist.size(); i++) {
      
                      if (temp[0].equalsIgnoreCase(friendslist.get(i).getName())) {
      
                          friendslist.get(i).setStatus(status);
                          Log.d(TAG, "kilepet/belepet " + friendslist.get(i).getName() + " - " + friendslist.get(i).getStatus());
      
                          // ShowInfoDialog(friendslist.get(i).getName()+"is "+status);
                          Log.d(TAG, "WATERFAK");
      
                      }
                  }
      
              }
      

      如果您使用 RosterListener,它会实时更新状态,对我来说效果很好。

      【讨论】:

      • 你能解释一下你的代码中好友列表的类型吗?
      • 实体朋友包含可以拥有其他用户的所有数据(姓名、电子邮件、状态、头像等),当我在应用程序之后请求公鸡时,我会填充列表。启动并使用 ejjaberd 缺乏的第三方服务器。
      • 嗨@cesztoszule ..我正在使用与我的名册相同的上述方法..但存在更改方法不止一次调用7-8次。我想知道为什么它会这样。
      【解决方案4】:
      ConnectToServer(){
          final ProgressDialog dialog = ProgressDialog.show(ChatWindowFragmentActivity.this,
                  "Connecting...", "Please wait...", false);
          Thread t = new Thread(new Runnable() {
              @Override
              public void run() {
      
      
                  // Object of XmppClient class
                  XmppClient mXmppClient = new XmppClient();
      
                  /*
                   * // Create a connection ConnectionConfiguration connConfig =
                   * new ConnectionConfiguration(HOST, PORT);
                   */
                  XMPPConnection connection = null;
      
                  try {
                      SmackAndroid.init(ChatWindowFragmentActivity.this);
                      connection = mXmppClient.connectionToXmppServer();
                  } catch (XMPPException e) {
                      // TODO Auto-generated catch block
            //                    setConnection(null, null);
                  }
                  try {
                      mXmppClient.loginUser(connection, USERNAME, PASSWORD);
                      Log.i("XMPPChatDemoActivity",
                              "Logged in as" + connection.getUser());
                      // Set the status to available
                      Presence presence = new Presence(Presence.Type.available);
                      connection.sendPacket(presence);
      
                      setConnection(connection);
      
                      Roster roster = connection.getRoster();
      
                       /*
                      Fetch USER availability
                      */
      
      
                      switch (isUserAvailable(connection)){
                          case 0:
                              imgAvailability.setBackgroundColor(Color.GRAY);
                              break;
                          case 1:
                              imgAvailability.setBackgroundColor(Color.GREEN);
                              break;
                          case 2:
                              imgAvailability.setBackgroundColor(Color.YELLOW);
                              break;
                          case 3:
                              imgAvailability.setBackgroundColor(Color.RED);
                              break;
                          default:
                              break;
                      }
      
      
                      Collection<RosterEntry> entries = roster.getEntries();
                      for (RosterEntry entry : entries) {
      
                          Log.d("XMPPChatDemoActivity",
                                  "--------------------------------------");
                          Log.d("XMPPChatDemoActivity", "RosterEntry " + entry);
                          Log.d("XMPPChatDemoActivity",
                                  "User: " + entry.getUser());
                          Log.d("XMPPChatDemoActivity",
                                  "Name: " + entry.getName());
                          Log.d("XMPPChatDemoActivity",
                                  "Status: " + entry.getStatus());
                          Log.d("XMPPChatDemoActivity",
                                  "Type: " + entry.getType());
                          Presence entryPresence = roster.getPresence(entry
                                  .getUser());
      
                          Log.d("XMPPChatDemoActivity", "Presence Status: "
                                  + entryPresence.getStatus());
                          Log.d("XMPPChatDemoActivity", "Presence Type: "
                                  + entryPresence.getType());
      
                          Presence.Type type = entryPresence.getType();
                          if (type == Presence.Type.available)
                              Log.d("XMPPChatDemoActivity", "Presence AVAILABLE");
                          Log.d("XMPPChatDemoActivity", "Presence : "
                                  + entryPresence);
                      }
      
      
      
                  } catch (XMPPException e) {
      
                      e.printStackTrace();
                      Log.e("XMPPChatDemoActivity", "Failed to log in as "
                              + USERNAME);
                      Log.e("XMPPChatDemoActivity", e.toString());
                      new ShowAlert(ChatWindowFragmentActivity.this,e.getMessage(), false).show(
                              getSupportFragmentManager(), TAG);
         //                    setConnection(null, null);
                  }
      
                  dialog.dismiss();
              }
          });
          t.start();
          dialog.show();
      }
      

      你的方法在里面被调用。

      【讨论】:

      • 我得到这个 Presence.Mode userMode "null" 和 boolean isOnline "false"
      • 嗨@Rahul Upadhyay 我也遇到了同样的问题,我使用了 Gaurav Arora 建议的解决方案,但它对我不起作用你找到解决方案的任何替代品吗
      • @KK_07k11A0585 不,我什么都没找到
      • @Crazy,我还没有找到任何东西。从那天起就没有工作了。 :( 对此的一个建议是,使用 GCM,其中包含 xmpp,所以使用它很好。developer.android.com/google/gcm/ccs.html
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2015-04-03
        • 1970-01-01
        • 2017-06-07
        • 1970-01-01
        • 2021-07-06
        • 2015-07-25
        • 2017-05-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多