Android asmack:stateChange从未调用过

时间:2014-11-28 10:21:54

标签: android smack asmack

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

<message id='5ec7d' to='admin@testserver123.net' from='praveenraj@testserver123.net/682e3641' type='chat'><composing xmlns="http://jabber.org/protocol/chatstates" /></message>

<message id='9a93f22' to='admin@testserver123.net' from='praveenraj@testserver123.net/682e3641' type='chat'><body>hi</body><active xmlns="http://jabber.org/protocol/chatstates" /></message>

<message to='admin@testserver123.net' from='praveenraj@testserver123.net/682e3641' type='chat'><active xmlns="http://jabber.org/protocol/chatstates" /></message>

但解析xml以获得编写状态并不是一个好主意。有人可以帮助我理解为什么stateChanged永远不会被召唤。

2 个答案:

答案 0 :(得分:4)

我正在使用aSmack正在开发一个项目,这就是我解决问题的方法,希望它可以帮到你。 我假设您已创建ChatStateManager的实例,例如:

ChatStateManager chatStateManager = ChatStateManager.getInstance(connection);

然后发送撰写状态,其中连接是您当前的xmpp连接, currentChat 聊天您为当前对话创建了



    @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个不同的状态,在下面的情况下是撰写状态

<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>

现在这就是它变得有趣的地方(回答你的问题)。我抓住每个传入的数据包并将其发送给BroadcatsReceiver以通知我。请注意,如果传入的数据包有 null 正文,这意味着它不是带有文本的实际消息,而是 ChatState 消息。

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);
            }

 public boolean isIncomingComposingMessage(String xmlMessage) {

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

    }

我知道这可能只是一个&#34;解决方法&#34;如果有人读到这个有更好的答案,请发布,以便我们都可以从中学习。

谢谢,我希望它有所帮助。

答案 1 :(得分:0)

如果您查找Asmack lib,那么您可以看到方法updateChatState(Chat paramChat, ChatState paramChatState)将检查您当前的状态是否与旧状态相同,如果是,那么该方法返回false,这就是您的原因每次都没有收到回调。

  

为什么会这样?

//Asmack lib method 
private boolean updateChatState(Chat paramChat, ChatState paramChatState) {
    ChatState localChatState = (ChatState) this.chatStates.get(paramChat);
    if (localChatState != paramChatState) {
        this.chatStates.put(paramChat, paramChatState);
        return true;
    }
    return false;
}
  

如果你想在每次做某事的时候收到回叫   下面,

    public class ChatlListener implements MessageListener, ChatStateListener{
        @Override
        public void stateChanged(Chat paramChat, ChatState paramChatState) {
               // this method will call only if status change , not on same status 
        }

        @Override
        public void processMessage(Chat paramChat, Message paramMessage) {

            ChatStateExtension chatStateExtension = (ChatStateExtension) paramMessage.getExtension("http://jabber.org/protocol/chatstates") ;
            Log(TAG,"Current chat status : " + chatStateExtension.getElementName());
        }
}