XMPP aSmack - How can I get the current user state (offline/online/away/etc.)?

前端 未结 5 2082
自闭症患者
自闭症患者 2020-12-08 15:54

I am new to xmpp/asmack in android.

Can anyone please help me in getting the presence of the user\'s friends ( roster list)

I am using this :



        
相关标签:
5条回答
  • 2020-12-08 16:26
    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();
    }
    

    And your method called inside it.

    0 讨论(0)
  • 2020-12-08 16:31
            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");
    
                    }
                }
    
            }
    

    If you use RosterListener, it updates the presence in real time, it works for me just fine.

    0 讨论(0)
  • 2020-12-08 16:41

    use like this

    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;
    }
    
    0 讨论(0)
  • 2020-12-08 16:49

    As my experience before you can see status and other from Presence you need to subscribe the user.

    for example: user A want to see status and available status from user B, in this case, user A need to subscribe user B. after that user A can see the user B Presence.

    Subscribe Code

    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);
            }
    
    0 讨论(0)
  • 2020-12-08 16:53

    Just use like this :

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

    Let me know if you have any problem regarding xmpp/asmack

    0 讨论(0)
提交回复
热议问题