2016-08-17 2 views
1

Я использую код из официальной документации smack API для отправки сообщения на конкретный Jabber ID.
CLick HereКак отправить одно сообщение с помощью smack API 4.1.0 android

Я получаю сообщения из комнаты, используя код ниже.

public void joinChatRoom(){ 
     MultiUserChatManager manager = MultiUserChatManager.getInstanceFor(connection); 
     multiUserChat = manager.getMultiUserChat("[email protected]"); 
     try { 
      multiUserChat.join("user"); 
     } catch (SmackException.NoResponseException e) { 
      e.printStackTrace(); 
     } catch (XMPPException.XMPPErrorException e) { 
      e.printStackTrace(); 
     } catch (SmackException.NotConnectedException e) { 
      e.printStackTrace(); 
     } 
     ChatManager.getInstanceFor(connection).addChatListener(new ChatManagerListener() { 
      @Override 
      public void chatCreated(Chat chat, boolean createdLocally) { 
    chat.addMessageListener(new ChatMessageListener() { 
     @Override 
     public void processMessage(Chat chat, Message message) { 
      System.out.println(message.getBody()); 
     } 
    }); 
      } 
     }); 
     System.out.println("Test"); 
    } 

Мой Вопрос в том, что как я могу отправить сообщение конкретному JID, потому что я не в состоянии работать это даже после того, как много прибегая к помощи того, что я пропавшими без вести. Соединение - прекрасный пользователь, также аутентифицируется, но ниже код теперь работает для отправки сообщения.

public void sendMsg() { 
     if (connection.isConnected()) { 
      // Assume we've created an XMPPConnection name "connection"._ 
      chatmanager = ChatManager.getInstanceFor(connection); 
      newChat = chatmanager.createChat("[email protected]", new ChatMessageListener() { 
       @Override 
       public void processMessage(Chat chat, Message message) { 
        System.out.println("Received Message:"+message); 
       } 
      }); 

      try { 
       System.out.println("check the message...."); 
       newChat.sendMessage("Howdy!alksd;lsakdsa;lkdsa;lksa;lsa"); 
      } catch (SmackException.NotConnectedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

Любая помощь будет оценена Спасибо.

+0

не получилось, вы использовали конференцию и попросили один-один чат? – Saveen

+0

oky thats моя ошибка я удаляю конференцию –

ответ

2

Вот пример отправки сообщения кода из моего последнего проекта:

private void sendMessage(String body, String toJid) { 
    try { 
     Jid jid = JidCreate.from(toJid + "@" + MyApplication.CHAT_DOMAIN); 
     Chat chat = ChatManager.getInstanceFor(mConnection) 
       .createChat(jid.asJidWithLocalpartIfPossible()); 
     chat.sendMessage(body); 
    } catch (Exception e) { 
    } 
} 

UPDATE:

Как получить сообщение:

Когда вы аутентификацией:

ChatManager.getInstanceFor(mConnection).addChatListener(YourConnectionClass.this); 

(YourConnectionClass должны осуществлять ChatManagerListener и ChatMessageListener)

Кроме того, необходимо реализовать методы ниже:

@Override 
public void chatCreated(Chat chat, boolean b) { 
    chat.addMessageListener(ChatConnection.this); 
} 

@Override 
public void processMessage(Chat chat, Message message) { 
    if (message.getType().equals(Message.Type.chat) || message.getType().equals(Message.Type.normal)) { 
     if (message.getBody() != null) { 
      Jid jid = message.getFrom(); 
      Localpart localpart = jid.getLocalpartOrNull(); 
      ... 
     } 
    } 
} 
+0

Хорошо, позвольте мне проверить пожалуйста –

+0

Спасибо, но может у вас также рассказать мне, как я должен получать сейчас, когда я добавляю слушателя в чат-экземпляр, он дает исключение –

1

Выполните несколько шагов по одному на одно сообщение в XMPP: В StanzaListener вы получили все сообщение с добавлением связь между двумя людьми, но если вы хотите получить конкретный чат с двумя людьми, используйте ChatMessageListener.

Шаг 1. Объявить в качестве глобальных переменных

ChatManagerListener chatListener; 
ChatMessageListener messageListener; 
Chat chat; 
private Jid opt_jid; 
StanzaListener packetListener; 

Шаг 2. Используйте этот код в OnCreate или в фрагменте

Примечание: Убедитесь, что вы связаны с сервером чата.

try { 
     String opt_jidStr = "user_" + userid; 
     try { 
      opt_jid = JidCreate.bareFrom(Localpart.from(opt_jidStr), Domainpart.from(Common.HOST)); 
      PurplkiteLogs.logError(TAG,"opt jid :" + opt_jid); 
     } catch (XmppStringprepException e) { 
      e.printStackTrace(); 
     } 
     messageListener = new ChatMessageListener() { 
      @Override 
      public void processMessage(Chat chat, Message message) { 
       AppLogs.logInfo(TAG, "chat get me something " + message.getBody()); 
      } 
     }; 

     packetListener = new StanzaListener() { 
      @Override 
      public void processPacket(Stanza packet) throws SmackException.NotConnectedException, InterruptedException { 

       if (packet instanceof Message) { 
        final Message message = (Message) packet; 

        } 
      } 
     }; 

     chatListener = new ChatManagerListener() { 

      @Override 
      public void chatCreated(Chat chatCreated, boolean local) { 
       onChatCreated(chatCreated); 
      } 
     }; 

     XMPP.getInstance().getConnection(acitiviy)).addAsyncStanzaListener(stanzaListener, null); 
     ChatManager.getInstanceFor(XMPP.getInstance().getConnection(acitiviy))) 
      .addChatListener(chatManagerListener); 
     ServiceDiscoveryManager sdm = ServiceDiscoveryManager 
      .getInstanceFor(XMPP.getInstance().getConnection(acitiviy))); 
     sdm.addFeature("jabber.org/protocol/si"); 
     sdm.addFeature("http://jabber.org/protocol/si"); 
     sdm.addFeature("http://jabber.org/protocol/disco#info"); 
     sdm.addFeature("jabber:iq:privacy"); 


     try { 
      String addr1 = XMPP.getInstance().getUserLocalPart(getActivity()); 
      String addr2 = opt_jid.toString(); 

      if (addr1.compareTo(addr2) > 0) { 
       String addr3 = addr2; 
       addr2 = addr1; 
       addr1 = addr3; 
      } 
      chat = ChatManager.getInstanceFor(
      XMPP.getInstance().getConnection(acitiviy))) 
      .getThreadChat(party1 + "-" + party2); 
      AppLogs.logInfo(TAG, "chat value single chat :" + chat + " , " + addr2 + " , " + addr1); 
      // for subscribed the user 
      Presence subscribe = new Presence(Presence.Type.subscribe); 
      subscribe.setTo(opt_jidStr); 
      XMPP.getInstance().getConnection(acitiviy)).sendStanza(packet); 
      // for subscribed the user 

      if (chat == null) { 
      chat = ChatManager.getInstanceFor(
      XMPP.getInstance().getConnection(acitiviy)) 
      .createChat(jid, party1 + "-" + party2, 
        messageListener); 
       AppLogs.logInfo(TAG, "chat value single chat 1 :" + chat); 
      } else { 
       chat.addMessageListener(messageListener); 
       AppLogs.logInfo(TAG, "chat value single chat 2:" + chat); 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 


    } catch(Exception e) { 
     e.printStackTrace(); 
    } 

Шаг 3. Метода 12:59 чат Волеизъявитель

void onChatCreated(Chat chatCreated) { 
    if (chat != null) { 
     if (chat.getParticipant().getLocalpart().toString().equals(
       chatCreated.getParticipant().getLocalpart().toString())) { 
      chat.removeMessageListener(messageListener); 
      chat = chatCreated; 
      chat.addMessageListener(messageListener); 
     } 
    } else { 
     chat = chatCreated; 
     chat.addMessageListener(messageListener); 
    } 
} 


void sendMessage(String message) { 
    if (chat != null) { 
     try { 
      chat.sendMessage(message); 

     } catch (SmackException.NotConnectedException e) { 
     } catch (Exception e) { 

     } 
    } 
} 

Шаг 4. уничтожить

XMPP.getInstance().removeChatListener(getActivity(), chatListener); 
     if (chat != null && messageListener != null) { 

      XMPP.getInstance().getConnection(acitiviy)).removeAsyncStanzaListener(stanzaListener); 
      chat.removeMessageListener(messageListener); 
     } 

Надеется, что это поможет вам, и если вы хотите получить больше информации, посмотри from here. Thankyou

+0

Спасибо большое :) –