简体   繁体   中英

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

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

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("youtID@sample.com", "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.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM