Rahul Lohra
Rahul Lohra

Reputation: 854

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

Upvotes: 4

Views: 2154

Answers (3)

Z. Mei
Z. Mei

Reputation: 31

A simple demo about sending and receiving masseges:

import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.ChatManager;
import org.jivesoftware.smack.ChatManagerListener;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.Message;

public class Test {
    public static void main(String args[]) throws XMPPException {
        ConnectionConfiguration config = new ConnectionConfiguration("127.0.0.1", 5222);    
        XMPPConnection connection = new XMPPConnection(config); 
        connection.connect();   
        connection.login("userx", "123456");
        ChatManager cm = connection.getChatManager(); 
        Chat chat = cm.createChat("tongqian@tsw-PC", null);
        /*
         * add listener
         */
        cm.addChatListener(new ChatManagerListener() {
            @Override
            public void chatCreated(Chat chat, boolean create) {
                chat.addMessageListener(new MessageListener() {
                    @Override
                    public void processMessage(Chat chat, Message msg) {
                        System.out.println(chat.getParticipant() + ":" + msg.getBody());
                    }
                });
            }
        });
        chat.sendMessage("hello");  
        while(true);        
        //connection.disconnect();  
    }
}

Upvotes: 0

Kevin Chen
Kevin Chen

Reputation: 1

Refer to this example:

import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.PacketCollector;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.filter.AndFilter;
import org.jivesoftware.smack.filter.PacketFilter;
import org.jivesoftware.smack.filter.PacketTypeFilter;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Packet;

public class GoogleTalkDemo extends Thread{
    private XMPPConnection xmppConnection;

    public void connect(String server, int port, String s) throws Exception {
        xmppConnection = new XMPPConnection(new ConnectionConfiguration(server, port,s));
        xmppConnection.connect();
    }

    public void disconnect(){
        if(xmppConnection != null){
            xmppConnection.disconnect();
            interrupt();
        }
    }

    public void login(String username, String password) throws Exception{
        connect("talk.google.com", 5222, "gmail.com");
        xmppConnection.login(username, password);
    }

    public void run(){
        try {
            login("[email protected]", "your password");
            System.out.println("Login successful");
            listeningForMessages();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void main(String args[]) throws Exception {
        GoogleTalkDemo gtd = new GoogleTalkDemo();
        gtd.run();
    }

    public void listeningForMessages() {
        PacketFilter filter = new AndFilter(new PacketTypeFilter(Message.class));
        PacketCollector collector = xmppConnection.createPacketCollector(filter);
        while (true) {
            Packet packet = collector.nextResult();
            if (packet instanceof Message) {
                Message message = (Message) packet;
                if (message != null && message.getBody() != null)
                    System.out.println("Received message from "
                            + packet.getFrom() + " : "
                            + (message != null ? message.getBody() : "NULL"));
            }
        }
    }
}

Hope it will help you.

Upvotes: 0

user1140237
user1140237

Reputation: 5045

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

Upvotes: 2

Related Questions