Android asmack:stateChange 从未被调用

2024-05-02

我正在使用 asmack xmpp 客户端构建一个聊天应用程序。聊天工作正常,我已经实施了ChatStateListener but stateChanged方法永远不会被调用。目前,为了获取撰写状态,我正在解析消息 xml。以下是撰写、文本、活动的消息格式。

<message id='5ec7d' to='[email protected] /cdn-cgi/l/email-protection' from='[email protected] /cdn-cgi/l/email-protection/682e3641' type='chat'><composing xmlns="http://jabber.org/protocol/chatstates" /></message>

<message id='9a93f22' to='[email protected] /cdn-cgi/l/email-protection' from='[email protected] /cdn-cgi/l/email-protection/682e3641' type='chat'><body>hi</body><active xmlns="http://jabber.org/protocol/chatstates" /></message>

<message to='[email protected] /cdn-cgi/l/email-protection' from='[email protected] /cdn-cgi/l/email-protection/682e3641' type='chat'><active xmlns="http://jabber.org/protocol/chatstates" /></message>

但是解析 xml 来获取撰写状态并不是一个好主意。有人可以帮助我理解为什么吗stateChanged永远不会被打电话。


我现在也在使用 aSmack 进行一个项目,这就是我解决问题的方法,希望它可以帮助你。 我假设您已经创建了一个实例聊天状态管理器 https://www.igniterealtime.org/builds/smack/docs/latest/javadoc/org/jivesoftware/smackx/chatstates/ChatStateManager.html例如:

ChatStateManager chatStateManager = ChatStateManager.getInstance(connection);

然后发送构成州,哪里联系是您当前的 xmpp 连接,并且当前聊天 is the Chat您为当前对话创建的



    @Override
         public void onTextChanged(CharSequence s, int start, int before, int count) {
                if(connection != null){
                    try {
                        chatStateManager.setCurrentState(ChatState.composing, currentChat);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }

其他客户将向您发送Packet https://www.igniterealtime.org/builds/smack/docs/latest/javadoc/org/jivesoftware/smack/packet/Packet.html对于不同的状态,在下面的情况下是构成 state

<message id='16vn2-83' to='jabberusername@ip-address' from='jabberusername@ip-address' type='chat'><thread>781de2f5-8883-4b16-a3b2-3bf7aff1efe9</thread><composing xmlns="http://jabber.org/protocol/chatstates" /></message>

现在这就是有趣的地方(回答你的问题)。我抓取每个传入的数据包并将其发送到广播接收器以通知我。请注意,如果传入数据包有null正文意味着它不是带有文本的实际消息,而是聊天状态信息。

if (packet.getBody() == null) {

                Intent i = new Intent();
                i.setAction(Constants.ACTION_TYPING_LISTENER);
                i.putExtra(Constants.ACTION_EXTRA_WHO_TYPING, getSimpleUsername(packet.getFrom()));
                if (isIncomingComposingMessage(msg.toXML().toString())) {

                    i.putExtra(Constants.ACTION_EXTRA_MESSAGESTATE, ChatState.composing.toString());
                } else {
                    i.putExtra(Constants.ACTION_EXTRA_MESSAGESTATE, ChatState.paused.toString());
                }
                sendBroadcast(i);
            }

And

 public boolean isIncomingComposingMessage(String xmlMessage) {

        if (xmlMessage.indexOf(ChatState.composing.toString()) == -1) {
            return false;
        } else {
            return true;
        }

    }

我知道这可能只是一个“解决方法”,如果阅读本文的人有更好的答案,请发布它,以便我们都可以从中学习。

谢谢你,希望有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android asmack:stateChange 从未被调用 的相关文章

随机推荐