Android - Smack存在和"键入"功能不起作用

时间:2015-10-05 07:42:00

标签: java android xmpp chat smack

我在Android应用中使用Smack库v4.1.0(不是aSmack)进行聊天功能。我似乎无法使用以下两个功能:

  1. 用户存在(在线,上次见到)
  2. 聊天消息状态(已发送,已发送,已读)
  3. 对于User Presence,我使用以下代码,该代码始终返回null

    Presence userPresence = roster.getPresence(toUser);
    System.out.println("*** User status: " + userPresence.getStatus());
    
    if (userPresence.getMode() == Presence.Mode.available || userPresence.getMode() == Presence.Mode.chat) {
        lblIsTyping.setText("Online");
    } else {
        lblIsTyping.setText("Offline");
    }
    

    对于消息状态,我使用以下代码:

    private class MessageListenerImpl implements MessageListener, ChatStateListener {
    
        @Override
        public void processMessage(Chat chat, Message message) {
            processMessageCore(message);
        }
    
        @Override
        public void stateChanged(Chat chat, ChatState chatState) {
            System.out.println("*** chat: " + chat.toString());
            if (ChatState.composing.equals(chatState)) {
                lblIsTyping.setText("typing...");
                System.out.println("Chat State: " + chat.getParticipant() + " is typing..");
            } 
        }
    
        @Override
        public void processMessage(Message message) {
            processMessageCore(message);
        }
    }
    

    并将其用作:

    ChatManager.getInstanceFor(HCSmackService.getInstance().getConnection()).createChat(toUser, mThreadID, new MessageListenerImpl());

    但回调并没有被调用过。

    如何使用新的Smack Library在Android上运行这些工作?有人已经实现了这些功能吗?

    谢谢!

1 个答案:

答案 0 :(得分:3)

  1. 要接收用户在线状态,您需要先发送initial presence。请注意,没有type属性的状态数据包被视为“在线”状态。

  2. Chat states由您的好友的客户端应用程序生成。通常情况下,他们不会将聊天状态发送给“离线”联系人和非“名册”的联系人。