Smack: возможно ли получить сообщение, составленное пользователем, когда он пишет его в чате? - PullRequest
0 голосов
/ 04 февраля 2020

У нас есть приложение чата, которое использует Smack, XMPP, ejabberd. Мне интересно, возможно ли достичь чего-то вроде следующего:

  1. Чат открыт между 2 пользователями.
  2. Пользователь1 печатает какое-то сообщение.
  3. Пользователь2 - это смог увидеть сообщение, набранное пользователем1, когда он его набирает.

Я провел небольшое исследование, но не смог найти ничего связанного.

Пожалуйста, дайте мне знать, как добиться этот вариант использования.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

С помощью Smack легко, когда пользователь изменяет текст, который вы отправляете, набрав текст другому человеку, используя ChatStateExtension:

 private void sendTypingStatus(final String toJid) {
     //you must have a valid xmpp connection of course
     if (null == mConnection)
        return;

    try {
        Message message = new Message(JidCreate.from(toJid));
        message.addExtension(new ChatStateExtension(ChatState.composing));

        message.setType(Message.Type.chat);
        mConnection.sendStanza(message);

    } catch (InterruptedException | SmackException.NotConnectedException | XmppStringprepException ex) {
        Log.w(TAG, "sendTypingStatus error", ex);
    }
}

Другой человек должен быть готов принять строфу и используйте это правильно. Для этого лучше всего использовать ChatStatesStanzaListener:

public class ChatStatesStanzaListener implements StanzaListener {

private static final String TAG = ChatStatesStanzaListener.class.getSimpleName();

@Override
public void processStanza(Stanza packet) {
    Message message = (Message) packet;
    if (message.hasExtension(ChatStateExtension.NAMESPACE)) {
        ChatStateExtension chatStateExtension = (ChatStateExtension) message.getExtension(ChatStateExtension.NAMESPACE);
        ChatState chatState = chatStateExtension.getChatState();
        String fromJid = message.getFrom().asBareJid().toString();

        if (message.getType().equals(Message.Type.chat)) {
            Log.v(TAG, "got chat state " + fromJid + " " + message.getType() + " " + chatState);
 //you got youe information here, call a callback or broadcast an event, whatever

        } else if (message.getType().equals(Message.Type.groupchat)) {
            //out of your question
        }
    }
}

}

Не забудьте добавить прослушиватель stanza в ваше соединение xmpp, как только оно будет установлено: 1. Установите раздел фильтр:

 // set up a stanzalistener and filter chatstates messages only
        StanzaFilter chatStatesStanzaFilter = stanza -> {
            // filter for chatstates message only
            return stanza.hasExtension(ChatStateExtension.NAMESPACE);
        };

Используйте его после инициализации подключения xmpp:

mConnection.addAsyncStanzaListener(new ChatStatesStanzaListener(), chatStatesStanzaFilter);

Надеюсь, это поможет:)

0 голосов
/ 20 апреля 2020

Это невозможно. Вы можете отправить текст как пользовательские типы, но каждая часть будет go как независимое сообщение. Если вы хотите это, вы можете захотеть сделать это по-своему. XMPP не может этого сделать!

...