javaandroidxmppsmackasmack

How to receive message without using createChat for android XMPP chat smack api


Hi I am confused with the logic of implementing chatManagerListener interface inside a Service. Below is my service code:

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);
}



}

Whenever is send a packet i am getting this following exception .I don't kno why its arising

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 simple terms i want to know how to implement ChatMessage listener in the service.Please be kind


Solution

  • You need to createchat once you successfully connected & authenticated

    Once you got the instance of ChatManager.For package transmission you need to createchat with peer/group check this link for method to createchat.

     chatManager = ChatManager.getInstanceFor(abstractXMPPConnection);
    
    newChat = chatmanager.createChat(userid, chatManagerListener);  
    

    once you get the Chat instance you can send package & retrive on your chatmanagerListner

    from newChat you can sendMessage

    To get Package (message, chat)

    You can try below code if your connection/authentication process is done successfully than

    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

    You can try using PacketListener.

    XMPPConnection's addPacketListener method check this link for details.

    Add PacketListener to XMPPConnection with PacketFilter type Message

    But before adding packetlistner remove if already added any instance in xmppconnection.

    Check below code

    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();
            }
        }