Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用Smack了解XMPP openfire中的键入状态_Android_Xmpp_Openfire_Smack_Asmack - Fatal编程技术网

Android 如何使用Smack了解XMPP openfire中的键入状态

Android 如何使用Smack了解XMPP openfire中的键入状态,android,xmpp,openfire,smack,asmack,Android,Xmpp,Openfire,Smack,Asmack,我正在使用OpenFireXMPP服务器开发聊天应用程序。我可以在两个用户之间进行文字聊天。但我想知道有人在键入消息时的键入状态。所以我创建了一个类:- public class typingStatus implements ChatStateListener { @Override public void processMessage(Chat arg0, Message arg1) { // TODO Auto-generated method stub

我正在使用OpenFireXMPP服务器开发聊天应用程序。我可以在两个用户之间进行文字聊天。但我想知道有人在键入消息时的键入状态。所以我创建了一个类:-

public class typingStatus implements ChatStateListener {

    @Override
    public void processMessage(Chat arg0, Message arg1) {
        // TODO Auto-generated method stub

    }

    @Override
    public void stateChanged(Chat arg0, ChatState arg1) {
        // TODO Auto-generated method stub
        System.out.println(arg0.getParticipant() + " is " + arg1.name());

    }

}
但我很困惑,它将如何工作?我知道我需要一个包,我可以把它放在Listener中。但是我找不到那个包裹

请任何人建议,它将如何工作

还有Smack和asmack的区别是什么


谢谢大家!

要启用
ChatStateListener
您需要创建一个自定义
MessageListener

public class MessageListenerImpl implements MessageListener,ChatStateListener  {

    @Override
    public void processMessage(Chat arg0, Message arg1) {
        System.out.println("Received message: " + arg1);

    }

    @Override
    public void stateChanged(Chat arg0, ChatState arg1) {
        if (ChatState.composing.equals(arg1)) {
            Log.d("Chat State",arg0.getParticipant() + " is typing..");
        } else if (ChatState.gone.equals(arg1)) {
            Log.d("Chat State",arg0.getParticipant() + " has left the conversation.");
        } else {
            Log.d("Chat State",arg0.getParticipant() + ": " + arg1.name());
        }

    }

}
然后创建
MessageListener
对象

MessageListener messageListener = new MessageListenerImpl();
然后将其传递到createchat方法中

Chat newChat = chatmanager.createChat(jabber_id_of_friend, messageListener);

Smack和asmack的区别是什么?我终于找到了解决方案。我需要使用聊天监听器和聊天管理器,还需要使用内置的sendcomposingnotification功能。无需为此使用Messageeventrequestlistener接口或任何其他自定义类。我添加了以下行

connection.getChatManager().addChatListener(new ChatManagerListener() {

            @Override
            public void chatCreated(final Chat arg0, final boolean arg1) {
                // TODO Auto-generated method stub

                arg0.addMessageListener(new MessageListener()
                {

                    @Override
                    public void processMessage(Chat arg0, Message arg1) 
                    {
                        // TODO Auto-generated method stub

                        Log.d("TYpe Stat",title[0] + " is typing......");
                        Toast.makeText(getApplicationContext(),title[0] + " is typing......",Toast.LENGTH_SHORT).show();
                    }



                    }
                }); 
            }
        });
还需要像这样发送通知

mem.sendComposingNotification(etRecipient.getText().toString(), message.getPacketID());
        System.out.println("Sending notification");
其中mem是MessageEventManger的类型。
Ref:

您或您使用的另一个xmpp客户端应该发送聊天状态,因为您可以捕获该状态

像这样,

try {
      ChatStateManager.getInstance(GlobalVariables.xmppManager.connection).setCurrentState(ChatState.composing, chat);
    } catch (XMPPException e) {
        e.printStackTrace();
    }


使用此代码。希望这样可以工作

我正在使用聊天状态侦听器:

Chat chat = chatManager.createChat(jid,
                        new ChatStateChangedListener());
将chatstatelistener与上述每个jid绑定,然后:

public class ChatStateChangedListener implements ChatStateListener {

    public ChatStateChangedListener() {
        printLog("Chat State Changed Listner Constructor");
    }

    @Override
    public void processMessage(Chat arg0, Message arg1) {

    }


    @Override
    public void stateChanged(Chat chat, ChatState state) {

        if (state.toString().equals(ChatState.composing.toString())) {
                tvLastSeen.setText("Typing...");
            } else if (state.toString().equals(ChatState.paused.toString())) {
                tvLastSeen.setText("paused...");
            } else {
                tvLastSeen.setText("nothing");
            }

        }


    }

}

在类MMessageListener上创建以侦听传入消息

私有类MMessageListener实现MessageListener、ChatStateListener{

    public MMessageListener(Context contxt) {
    }


    @Override
    public void stateChanged(Chat chat, ChatState chatState) {

        mStatus = "Online";

        if (ChatState.composing.equals(chatState)) {

            mStatus = chat.getParticipant() + " is typing..";
            Log.d("Chat State", chat.getParticipant() + " is typing..");
        } else if (ChatState.gone.equals(chatState)) {
            Log.d("Chat State", chat.getParticipant() + " has left the conversation.");
            mStatus = chat.getParticipant() + " has left the conversation.";
        } else if (ChatState.paused.equals(chatState)){
            Log.d("Chat State", chat.getParticipant() + ": " + chatState.name());
            mStatus = "Paused";
        }else if (ChatState.active.equals(chatState)){
            mStatus = "Online";
        }

        // do whatever you want to do once you receive status


    }


    @Override
    public void processMessage(Message message) {

    }

    @Override
    public void processMessage(Chat chat, Message message) {


    }
}
将侦听器添加到聊天对象中

Chat Mychat=ChatManager.getInstanceFor(连接).createChat( "user2@localhost"), 格利斯滕夫人)

在edittext文本更改时向接收用户发送状态

ChatStateManager.getInstance(connection).setCurrentState(ChatState.composing,Mychat)


这对我来说很好。

但是您也可以从ProcessPacket获得它。 在您可以从中提取xml部分并处理它们之后,您将获得一个消息对象,该对象是否包含特定的聊天状态

    Message message = (Message) packet;
    String msg_xml = message.toXML().toString();

    if (msg_xml.contains(ChatState.composing.toString())) {
        //handle is-typing, probably some indication on screen
    } else if (msg_xml.contains(ChatState.paused.toString())) {
        // handle "stopped typing"
    } else {
       // normal msg
    }

现在根据您的要求进行处理。

只需在
ChatManager
安装后添加
ChatManager

chatManager =  ChatManager.getInstanceFor(getXmpptcpConnection());
ChatStateManager.getInstance(getXmpptcpConnection());
然后,您需要在
createChat(to,chatmasagelistener)
期间添加
ChatStateListener



谢谢sunil。看起来不错,给了我解决方案。我会检查。没有用户ID是其他参与者的jid,而不是登录到Hank you sunil的人。如果您有点时间。请检查以处理消息事件。请查看我检查过但未更改状态。请建议在Stackoverflow中检查此问题:您好,我在上面尝试过。。但不起作用!这是我的代码!如果有任何帮助,我们将不胜感激。……Message msg1=新消息(收件人,Message.Type.chat);msg1.setFrom(“user1@192.168.0.98“”;//我的id MessageEventManager事件=新建MessageEventManager(连接);//收件人id事件。sendComposingNotification(“tech1@192.168.0.98“,msg1.getPacketId());@Aneez,您需要处理在
processMessage()中收到的消息
,因为它接收所有传入的数据包,而不仅仅是键入状态的数据包。它可能是暂停、脱机/联机状态数据包或消息。因此,请尝试处理它,然后处理..嗨。我尝试了相同的方法,但对我无效..它既不发送复合通知,也不接收它。在接收和接收时都为null它来自ios。请帮助我找到这个。谢谢。仅供参考:从Hi Dharmesh合并,我也这样做了,但我在processMessage中撰写状态消息时总是得到null。我的EditText文本更改方法是:newChat=chatmanager.createChat(发送给,messageListener);message msg=new message(send_to,Message.Type.chat);msg.setFrom(USERNAME_LOGIN+“@”+HOST_NAME);//我的id newChat.sendMessage(msg);ChatStateManager.getInstance(connection).setCurrentState(ChatState.composing,newChat);这也不会将状态发送给其他人。仅供参考:合并自如何检查用户是否已暂停或不再键入EditText?可能您的服务器应用程序不支持它。您的意思是说我们的服务器未对此进行配置?但它可以在ios到ios之间正常工作。我正在EditText的textChangeListner上写这一行。聊天对象是chatmanager=connection.getChatManager();Chat Chat=chatmanager.createChat(“用户@”,listner);即使我从ios processMessage接收到撰写状态,消息也会为空。请帮助我找到发送和接收的解决方案。另外,我正在使用asmack libraryFYI:需要在EditText文本更改侦听器上进行合并。对吗?您好,Ahesanali Momin,您能告诉我您最后的具体情况吗?以及什么错误你将在XMPP中面对。有关更多信息,请在skype@piyush.gupta326向我发送消息。然后我们可以讨论更多,你的问题,并希望达到成功点。我没有收到任何错误,但当我开始键入代码时,我的意思是没有调用stateChangeListener。嘿,伙计,你读过这篇文档吗?这完全是理论,不是intere到目前为止,由于使用聊天客户端,大多数事情都非常清楚。我的意思是,请阅读该链接中的文档。我希望你能在那里找到解决方案。否则我们可以在这里讨论相同的问题。仅供参考:从供参考合并:从下次开始合并,也许只需回答一个问题并标记其余内容,让我们知道它们是重复的;发布相同的内容回答7次太过分了。
    Message message = (Message) packet;
    String msg_xml = message.toXML().toString();

    if (msg_xml.contains(ChatState.composing.toString())) {
        //handle is-typing, probably some indication on screen
    } else if (msg_xml.contains(ChatState.paused.toString())) {
        // handle "stopped typing"
    } else {
       // normal msg
    }
chatManager =  ChatManager.getInstanceFor(getXmpptcpConnection());
ChatStateManager.getInstance(getXmpptcpConnection());
chatManager.createChat(message.getTo(), chatMessageListener).sendMessage(message);

private ChatStateListener chatMessageListener = new ChatStateListener() {

    @Override
    public void stateChanged(Chat chat, ChatState state) {
        //State Change composing,active,paused,gone,etc
        Log.d(TAG, "ChatStateListener:::stateChanged -> " + chat.toString() + " \n -> " + state.toString());
    }

    @Override
    public void processMessage(Chat chat, Message message) {
        //Incoming Message
        Log.d(TAG, "ChatStateListener:::processMessage -> " + chat.toString() + " \n -> " + message.toString());
    }
};