如何在 Android 的 Smack 4.2 中了解 1:1 对话中的打字状态?

Posted

技术标签:

【中文标题】如何在 Android 的 Smack 4.2 中了解 1:1 对话中的打字状态?【英文标题】:How to know typing status in 1:1 conversation in Smack 4.2 in Android? 【发布时间】:2017-09-22 12:22:54 【问题描述】:

我正在 android 中构建一个聊天应用程序。我发送和接收消息,但我不知道如何知道会话的其他用户状态和输入状态。

我一直在阅读使用 ChatManagerLister,但在此版本中已弃用它。

在 Smack 4.2 中,ChatManager 类没有侦听聊天状态的方法。

【问题讨论】:

***.com/questions/33479355/… 感谢@Sarthak Mittal 的回答,但我看不到可能的解决方案。 MessageEventManager 类在 Smack 中处于旧模式 我将在一两天内在提到的链接中正确更新我的答案,现在有点忙! :) 顺便说一句,我已经手动添加了一个syncStanzaListener来监听打字状态的变化,也手动发送,我已经在上面的链接中发布了打字状态变化的相关Rx代码! :) 好的,提前谢谢!!我会等的 【参考方案1】:

您使用chatstates ejabberd 协议来输入状态。请阅读此文档可能会对您有所帮助XEP-0085: Chat State Notifications

android端需要实现以下代码

    Message msg= (Message) stanza;

    // below ChatStateExtension for Compossing message.
            ChatStateExtension state = (ChatStateExtension)msg.getExtension("http://jabber.org/protocol/chatstates");//jabber:x:event
            // if state (ChatStateExtension) !=null and is composing then call listener method if not error.
            if(state!=null) 
                Log.d(AppConstants.ELEMENT,"ChatStateExtension : " + state.toXML());
                if (state.getElementName().equals("composing")) 
                    if (msg.getType().equals(Message.Type.error)) 
                        return;
                    

                    if (iCallBackForTypingListener != null) 
                        DelayInformation timestamp = (DelayInformation) msg.getExtension("delay", "urn:xmpp:delay");
                        if (timestamp == null)
                            timestamp = (DelayInformation) msg.getExtension("x", "jabber:x:delay");

                        if (timestamp != null && timestamp.getReason().equalsIgnoreCase("Offline Storage")) //return if delay info is Offline Storage
                            return;
                        


        //update your typing listener
    iCallBackForTypingListener.onTypingStanza(fromJID, typingSender);
                    
//  xmpp.updateChatState(fromJID, state.getElementName(), sender);
                    return;
                 else if (state.getElementName().equals("paused")) 
                    return;
                

【讨论】:

以上是关于如何在 Android 的 Smack 4.2 中了解 1:1 对话中的打字状态?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Smack 4.2 中使用证书

Android Smack 4.2:“XMPPError: feature-not-implemented - cancel”(错误)

如何在 Android 的 Smack 中接收文件?

我在使用 smack 4.2 Openfire 创建 XMPP 客户端时遇到问题

我们如何在 smack 或来自 android 的 xmpp 中获得对发件人的消息读取/看到确认

我如何在 smack openfire android 中监听传入的订阅请求