2016-02-18 114 views
5

嗨我很困惑在Service内实现chatManagerListener接口的逻辑。 下面是我的服务代码:如何接收消息,而无需使用createChat android XMPP聊天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); 
} 



} 

只要是发送一个数据包我得到这个以下情况例外。我不硝酸钾为什么它的出现

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) 

简单来说,我想知道如何实施ChatMessage听众在service.Please是一种

回答

2

你需要createchat一旦连接成功&认证

一旦得到ChatManager的实例。对于包传输,您需要createchat与对等/组检查this link创建聊天方法。

chatManager = ChatManager.getInstanceFor(abstractXMPPConnection); 

newChat = chatmanager.createChat(userid, chatManagerListener); 

一旦你的Chat情况下,你可以把包放在你的chatmanagerListner

& retrive从newChat可以sendMessage

To get Package (message, chat)

你可以,如果你的连接/认证尝试下面的代码过程成功完成比

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

您可以尝试使用PacketListener

XMPPConnection的addPacketListener方法check this link for details

添加PacketListener到XMPPConnection与PacketFilter类型信息

但添加packetlistner之前删除,如果在xmppconnection已经添加任何实例。

检查下面的代码

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

根据你,我应该写内部'这上面的代码验证的公共无效(XMPPConnection连接,布尔恢复)' –

+0

你的代码实际上与已知的创建聊天'userJid ',听从未知'userJid'的消息怎么样? –

+0

@ChrisRedField检查更新回答它可能会帮助你 – user1140237