티스토리 뷰

활성화하려면 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());

그럼 당신은 추가 할 필요가 ChatStateListenercreateChat(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
댓글
공지사항
Total
Today
Yesterday
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30