[기계적 인조 인간] Smack을 사용하여 XMPP openfire에서 타이핑 상태를 아는 방법
활성화하려면 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();
그런 다음 create chat 메서드에 전달합니다.
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의 유형입니다. 참조 : http://www.igniterealtime.org/builds/smack/docs/latest/javadoc/org/jivesoftware/smackx/MessageEventManager.html
-------------------ChatManager chatManager = ChatManager.getInstanceFor(connection);
Chat chat= chatManager.createChat(to, new ChatStateListener() {
@Override
public void stateChanged(Chat chat, ChatState state) {
switch (state){
case active:
Log.d("state","active");
break;
case composing:
Log.d("state","composing");
break;
case paused:
Log.d("state","paused");
break;
case inactive:
Log.d("state","inactive");
break;
case gone:
Log.d("state","gone");
break;
}
}
@Override
public void processMessage(Chat chat, Message message) {
Log.d("processMessage","processMessage");
}
});
이 코드를 사용하십시오.
-------------------채팅 상태 리스너를 사용하고 있습니다.
Chat chat = chatManager.createChat(jid,
new ChatStateChangedListener());
위와 같이 각 jid에 chatstatelistener를 바인딩 한 다음 :
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 (connection) .createChat ( "user2 @ localhost"), mMessageListener);
edittext 텍스트 변경시 수신 사용자에게 상태 전송
ChatStateManager.getInstance (connection) .setCurrentState (ChatState.composing, Mychat);
이것은 나를 위해 잘 작동합니다.
-------------------귀하 또는 귀하가 사용하는 다른 xmpp 클라이언트는 채팅 상태를 보내야합니다. 상태를 파악할 수 있습니다.
이것처럼;
try {
ChatStateManager.getInstance(GlobalVariables.xmppManager.connection).setCurrentState(ChatState.composing, chat);
} catch (XMPPException e) {
e.printStackTrace();
}
또는
try {
ChatStateManager.getInstance(GlobalVariables.xmppManager.connection).setCurrentState(ChatState.gone, chat);
} catch (XMPPException e) {
e.printStackTrace();
}
-------------------그러나 ProcessPacket에서도 가져올 수 있습니다. 거기에서 xml 부분을 추출하고 특정 chatstate를 포함하는지 여부를 처리 할 수있는 메시지 객체를 얻을 수 있습니다.
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
}
이제 귀하의 요구 사항에 따라 처리하십시오.
-------------------intalization ChatStateManager
후에 추가하십시오 ChatManager
.
chatManager = ChatManager.getInstanceFor(getXmpptcpConnection());
ChatStateManager.getInstance(getXmpptcpConnection());
그럼 당신은 추가 할 필요가 ChatStateListener
시 createChat(to,chatMesageListener)
:
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());
}
};
출처
https://stackoverflow.com/questions/39916089