2016-02-18 14 views
5

Ciao, sono confuso con la logica di implementazione dell'interfaccia chatManagerListener all'interno di uno Service. Qui di seguito è il mio codice di servizio:Come ricevere messaggi senza usare createChat per Android XMPP chat smack api

public class MyService3 extends Service { 
ChatManager chatManager; 
ChatManagerListener chatManagerListener; 
AbstractXMPPConnection abstractXMPPConnection; 
MyXmpp2 myXmpp2; 

public MyService3() { 
} 


@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    Log.d("Myservice3:","Started"); 

    abstractXMPPConnection = myXmpp2.getConnection(); 
    abstractXMPPConnection.addConnectionListener(new ConnectionListener() { 
     @Override 
     public void connected(XMPPConnection connection) { 
      Log.d("XMPPConnection:","connected"); 
     } 

     @Override 
     public void authenticated(XMPPConnection connection, boolean resumed) { 
      Log.d("XMPPConnection:","authenticated"); 
      //Once authenticated start listening for messages 






     } 

     @Override 
     public void connectionClosed() { 
      Log.d("XMPPConnection:","connectionClosed"); 
     } 

     @Override 
     public void connectionClosedOnError(Exception e) { 
      Log.d("XMPPConnection:","connectionClosedOnError"); 
     } 

     @Override 
     public void reconnectionSuccessful() { 
      Log.d("XMPPConnection:","reconnectionSuccessful"); 

     } 

     @Override 
     public void reconnectingIn(int seconds) { 
      Log.d("XMPPConnection:","reconnectingIn"); 

     } 

     @Override 
     public void reconnectionFailed(Exception e) { 
      Log.d("XMPPConnection:","reconnectionFailed"); 

     } 
    }); 



    Log.d("isOnline:", myXmpp2.getConnection().isConnected() + ""); 
    chatManager = ChatManager.getInstanceFor(abstractXMPPConnection); 
    chatManager.addChatListener(chatManagerListener); 
    chatManagerListener = new ChatManagerListener() { 
     @Override 
     public void chatCreated(Chat chat, boolean createdLocally) { 

      chat.addMessageListener(new ChatMessageListener() { 
       @Override 
       public void processMessage(Chat chat, Message message) { 

        Log.d("Hello::","World"); 
        //NOT WORKNIG 
        if(message.getBody()!=null) 
        { 
         Log.d("Message::",message.getBody()); 
        } 
       } 
      }); 
     } 
    }; 





    return super.onStartCommand(intent, flags, startId); 
} 



} 

Ogni volta che è inviare un pacchetto sto ottenendo questo seguente eccezione .i non kno perché la sua derivante

Exception in packet listener java.lang.NullPointerException: Attempt to invoke interface method 'void org.jivesoftware.smack.chat.ChatManagerListener.chatCreated(org.jivesoftware.smack.chat.Chat, boolean)' on a null object reference 
                         at org.jivesoftware.smack.chat.ChatManager.createChat(ChatManager.java:255) 
                         at org.jivesoftware.smack.chat.ChatManager.createChat(ChatManager.java:287) 

In termini semplici voglio sapere come implementare ChatMessage ascoltatore nel service.Please essere gentile

risposta

2

È necessario createchat una volta si è collegato con successo & autenticato

Una volta ottenuta l'istanza di ChatManager.Per la trasmissione del pacchetto è necessario createchat con controllo peer/gruppo this link per il metodo per createchat.

chatManager = ChatManager.getInstanceFor(abstractXMPPConnection); 

newChat = chatmanager.createChat(userid, chatManagerListener); 

volta che si ottiene l'istanza Chat è possibile inviare il pacchetto & retrive sul chatmanagerListner

da newChat si può sendMessage

To get Package (message, chat)

Si può provare di seguito il codice se la connessione/autenticazione il processo viene eseguito con successo rispetto a

final Chat newChat = ChatManager.getInstanceFor(xmppConn).createChat(userJid, new MessageListener() { 
    @Override 
    public void processMessage(final Chat arg0, final Message arg1) { 
     LOG.info("Sent message: " + arg1.getBody()); 
    } 
    }); 
    try { 
    final Message message = new Message(); 
    message.setFrom(chatProperties.getDomain()); 
    message.setTo(userJid); 
    message.setType(Type.normal); 
    message.setBody(text); 
    message.setSubject(""); 
    newChat.sendMessage(message); 
    xmppConn.disconnect(); 
    } catch (final Exception e) { 
    LOG.error("Error while sending message to " + userName + ": ", e); 
    } 

UPDATE

Puoi provare a utilizzare PacketListener.

metodo AddPacketListener di XMPPConnection check this link for details.

Aggiungi PacketListener a XMPPConnection con PacketFilter Tipo di messaggio

Ma prima di aggiungere packetlistner rimuovere se già aggiunto alcun esempio nella xmppconnection.

Controlla qui sotto il codice

private PacketListener packetListener = new PacketListener() { 
     @Override 
     public void processPacket(Packet packet) { 
      if (packet instanceof Message) { 
       Message message = (Message) packet; 
       String chatMessage = message.getBody(); 
      } 
     } 
    }; 

    private void regiSterPackateListner() { 
     PacketTypeFilter filter = new PacketTypeFilter(Message.class); 
     try { 
      if (packetListener != null) { 
       //Avoid adding multiple packetlistner 
       abstractXMPPConnection.removePacketListener(packetListener); 
      } 
      abstractXMPPConnection.addPacketListener(packetListener, filter); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
+0

secondo voi, dovrei scrivere questo codice di cui sopra all'interno 'public void autenticata (connessione XMPPConnection, booleano riprese)' –

+0

il codice è in realtà la creazione di una chat con nota 'userJid ', per quanto riguarda l'ascolto di messaggi da unknown' userJid' –

+0

@ChrisRedField controlla l'aggiornamento in risposta può aiutarti – user1140237

Problemi correlati