Как узнать онлайн или оффлайн пользователя в привкусе в чате один на один? - PullRequest
0 голосов
/ 19 июня 2019

Я попробовал этот код, и все доступные фрагменты все еще не могут получить информацию о присутствии пользователя в сети или в автономном режиме. Пожалуйста, помогите мне. Заранее спасибо.

fun checkStatus() {
    val jid = JidCreate.entityBareFrom("QTX69RGLVQ3VVU8QUB@localhost")

    var roster = Roster.getInstanceFor(connection)
    var availability = roster.getPresence(jid);
    var  userMode = availability.getMode();
    retrieveState_mode(userMode, availability.isAvailable)
}

fun retrieveState_mode(userMode: Presence.Mode, isOnline:Boolean):Int {
    var userState = 0;
    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
}

Всегда получаю как 0

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Первым делом первым делом.Если вы прочитаете это:

https://xmpp.org/extensions/xep-0162.html

, вы найдете это: subscription = 'both': вы и контакт заинтересованы в информации о присутствии друг друга.

Итакесли ваш список настроен на подписку = «оба», вы оба должны быть в другом списке (скажем, в друзьях и одобрении в обоих направлениях), чтобы слушать информацию о присутствии друг друга.

Итак, зная предыдущий,Я сделал это с помощью Smack:

//Created presence packet listener
private StanzaListener presencePacketListener;

//In my connection creating
private XMPPTCPConnection createConnection() throws XmppStringprepException {
        XMPPTCPConnectionConfiguration.Builder config =  XMPPTCPConnectionConfiguration.builder();
        .......
        config.setSendPresence(true);
        .......
        return new XMPPTCPConnection(config.build());
}

//Then in login method
public void login() throws SmackInvocationException, XmppStringprepException {
        connect();
        try {
            //Add presencePacketListener to listen for subscribed users (Roster) presence
            con.addSyncStanzaListener(presencePacketListener, new StanzaTypeFilter(Presence.class));
            //Actual login
            .....
            onConnectionEstablished();
        } catch(Exception e) {          
            throw exception;
        }
}

// onConnectionEstablished method
private void onConnectionEstablished() {
        if (state != State.CONNECTED) {         
            sendPacket(new Presence(Presence.Type.available));
        }
}

При выполнении

sendPacket (new Presence (Presence.Type.available));

все пользователи вашей подписки будут получать этот пакет присутствия.Это будет обработано в

sencePacketListener

, который мы зарегистрировали ранее при входе в систему.

//PresencePacketListener
public class PresencePacketListener implements StanzaListener {
    private Context context;

    PresencePacketListener(Context context) {
        this.context = context;
    }

    @Override
    public void processStanza(Stanza packet) {
        Presence presence = (Presence)packet;
        Presence.Type presenceType = presence.getType();
        //Do sth with presence
    }
}
0 голосов
/ 19 июня 2019

Прослушивание изменений в реестре и присутствии

Типичное использование класса реестра - отображение дерева и групп записей вместе с текущим значением присутствия каждой записи.В качестве примера см. Изображение реестра в XMPP-клиенте Exodus справа.

Информация о присутствии, вероятно, будет часто меняться, а также возможно изменение или удаление записей в реестре.Для прослушивания изменений в реестре и данных о присутствии следует использовать RosterListener.Чтобы получать информацию обо всех изменениях в реестре, RosterListener должен быть зарегистрирован до входа на сервер XMPP.Следующий фрагмент кода регистрирует RosterListener в Roster, который печатает любые изменения присутствия в реестре до стандартного выхода.Обычный клиент будет использовать аналогичный код для обновления пользовательского интерфейса реестра с изменяющейся информацией.

Roster roster = Roster.getInstanceFor(con);
roster.addRosterListener(new RosterListener() {
    // Ignored events public void entriesAdded(Collection<String> addresses) {}
    public void entriesDeleted(Collection<String> addresses) {}
    public void entriesUpdated(Collection<String> addresses) {}
    public void presenceChanged(Presence presence) {
        System.out.println("Presence changed: " + presence.getFrom() + " " + presence);
    }
});

Обратите внимание, что для получения событий изменения присутствия необходимо подписаться на присутствие пользователей.См. Следующий раздел.

Источник

...