简体   繁体   中英

Android: How to maintain user online/offline status using quickblox?

I had integrated quickblox chat in my application and want to maintain user online and offline status and tried following options.

1) as described in doc i had followed this link https://quickblox.com/developers/SimpleSample-users-android#Online.5COffline_status but one issue is there that it not give clarity about user online status

2) used Ping Manager: https://quickblox.com/developers/Android_XMPP_Chat_Sample#Ping_a_user but it always give QBResponseException

3) QBRoaster: this option is not suitable as requirement.

[note : I am using quickblox version 3.3.1]

I have implemented QBPingManager as following

    public void checkUserOnlineStatus(String mOpponentName) {
        QBChatService.getInstance().getPingManager().setPingInterval(1);
        Performer<QBUser> qbUser = QBUsers.getUserByLogin(mOpponentName);
        qbUser.performAsync(new QBEntityCallback<QBUser>() {
            @Override
            public void onSuccess(QBUser qbUser, Bundle bundle) {
            final int mOpponentUserId = qbUser.getId();
            final QBPingManager pingManager = QBChatService.getInstance().getPingManager();
            pingManager.pingServer(new QBEntityCallback<Void>() {
                @Override
                public void onSuccess(Void aVoid, Bundle bundle) {
                    pingManager.pingUser(mOpponentUserId, new QBEntityCallback<Void>() {
                        @Override
                        public void onSuccess(Void aVoid, Bundle bundle) {
                            Timber.tag(TAG).w("Opponent User is online ");
                        }

                        @Override
                        public void onError(QBResponseException e) {
                            Timber.tag(TAG).e("message(ping user): " + e.getMessage() + "\n localized message: " + e.getLocalizedMessage());
                            e.printStackTrace();
                        }
                    });
                }

                @Override
                public void onError(QBResponseException e) {
                    Timber.tag(TAG).e("message (ping server): " + e.getMessage() + "\n localized message: " + e.getLocalizedMessage());
                }
            });


            }

            @Override
            public void onError(QBResponseException e) {
            Timber.tag(TAG).e("Error : " + e.getMessage() + "\n Message :  " + e.getLocalizedMessage());
            }
        });
      }

any help is appreciated thank you.

Here we will find online/offline status with last seen time/date :-

To get online/offline status of user you need to send and has to confirm subscription request

// to confirm subscription request
QBSubscriptionListener subscriptionListener = new QBSubscriptionListener() {
                @Override
                public void subscriptionRequested(int userId) {
                    try {
                        if (chatRoster != null)
                            chatRoster.confirmSubscription(userId);
                    } catch (SmackException.NotConnectedException e) {

                    } catch (SmackException.NotLoggedInException e) {

                    } catch (XMPPException e) {

                    } catch (SmackException.NoResponseException e) {

                    }
                }
            };

            chatRoster = QBChatService.getInstance().getRoster(QBRoster.SubscriptionMode.mutual, subscriptionListener);


// to send subscription request
     try {
           chatRoster.subscribe(qbChatDialog.getRecipientId()); //getRecipientId is Opponent UserID
         } catch (SmackException.NotConnectedException e) {
           e.printStackTrace();
          }

Send presence whenever user comes online/offline

   QBPresence presence = new QBPresence(QBPresence.Type.online, "I am now available", 1, QBPresence.Mode.available);
    try {
        chatRoster.sendPresence(presence);
    } catch (SmackException.NotConnectedException e) {

    } catch (Exception e) {
        e.printStackTrace();
    }

Get Presence of opponent user

QBPresence presence = chatRoster.getPresence(qbChatDialog.getRecipientId());
 if (presence.getType() == QBPresence.Type.online) {
    //online
  }else{
    //offline
  }

Identify when user's online status has been changed

QBRosterListener rosterListener = new QBRosterListener() {
        @Override
        public void entriesDeleted(Collection<Integer> userIds) {

        }

        @Override
        public void entriesAdded(Collection<Integer> userIds) {

        }

        @Override
        public void entriesUpdated(Collection<Integer> userIds) {

        }

        @Override
        public void presenceChanged(QBPresence presence1) {
            try {
                int userid = presence1.getUserId();
                int recid = qbChatDialog.getRecipientId();//opponent   user id
                if (userid == recid) {

                    if (presence1.getType() == QBPresence.Type.online)
                        status.setText(getResources().getString(R.string.online));
                    else {

                        status.setText("");
                        String lastseen = getlastseen();
                        if (lastseen.length() > 0) {
                            status.setText(lastseen);
                        }
                    }
                } else {
                }
            } catch (Exception e) {

            }

        }
    };

To get Last Seen of offline user

private String getlastseen() {
        String lastseen = "";
        String appendstring = "";
        try {
            long lastUserActivity = QBChatService.getInstance().getLastUserActivity(qbChatDialog.getRecipientId()); //returns last activity in seconds or error

            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.SECOND, -(int) lastUserActivity);

            String format = "dd MMM yyyy hh:mm a";
            if (DateUtils.isToday(calendar.getTimeInMillis())) {
                format = "hh:mm a";
                appendstring = ChatActivity.this.getResources().getString(R.string.today) + ",";
            } else if (isyesterday(calendar.getTimeInMillis())) {
                format = "hh:mm a";
                appendstring = ChatActivity.this.getResources().getString(R.string.yesterday) + ",";
            } else if (Calendar.YEAR == Calendar.getInstance().YEAR)
                format = "dd MMM hh:mm aa";

            SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);

            lastseen = simpleDateFormat.format(calendar.getTime());

        } catch (XMPPException.XMPPErrorException | SmackException.NotConnectedException e) {
        } catch (Exception e) {
            e.printStackTrace();
        }
        return appendstring + lastseen;
    }

You can use new feature of QuickBlox Android SDK since version 3.3.3 which called 'last activity'. You can call QBChatService.getInstance().getLastUserActivity(userId); As result you will get: - 0 if opponent online or - seconds ago opponent was online or - error if user newer logged to chat.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM