【问题标题】:smack presence listener in multi user chat多用户聊天中的 smack 存在监听器
【发布时间】:2016-05-30 11:25:26
【问题描述】:

多用户聊天中的smack 状态监听器没有被调用。使用 Smack Api 登录,然后添加 roster.addRosterListener(mRoasterListener); 但是当聊天室的其他用户的存在发生变化时无法成功收听。我尝试了以下代码来让在线监听器工作:

connection.login(loginUser, passwordUser);

MultiUserChatManager manager = 

MultiUserChatManager.getInstanceFor(connection);

muc = manager.getMultiUserChat(roomID + "@" +context.getString(R.string.group_chat_id));

Log.d("Join User: ", "Already Created");

muc.join(Utilities.getUserPhoneNo(context));

muc.addMessageListener(mGroupMessageListener);

Roster roster = Roster.getInstanceFor(connection);//luna

roster.addRosterListener(mRoasterListener);//roasterListener

Log.d("Joined User Phone: ", " " + Utilities.getUserPhoneNo(context));

这个类来监听状态变化......

public class RoasterListener implements RosterListener{
        public RoasterListener(Context context){

        }

        @Override
        public void entriesAdded(Collection<String> collection) {

        }

        @Override
        public void entriesUpdated(Collection<String> collection) {

        }

        @Override
        public void entriesDeleted(Collection<String> collection) {

        }

        @Override
        public void presenceChanged(Presence presence) {
            System.out.println("Presence changed: " + presence.getFrom() + " " + presence);
        }
    }

我尝试了许多 stackoverflow 提供的链接,但都没有成功。 请帮忙!

【问题讨论】:

标签: java android smack multiuserchat user-presence


【解决方案1】:

对于多用户聊天,您不必使用名册,因为遇到名册中没有的人是很正常的。

要知道谁在 muc 中,首先询问居住者:

muc.join(user,password);

List<String> occupantsAtJoinTime = muc.getOccupants();

                    for (String occupant : occupantsAtJoinTime)
                    {
                        System.out.println("occupant: "+occupant);
                        //actions
                    }

然后,为了保持 Occupants 列表更新,将 DefaultParticipantStatusListener 注册到您的 muc 并定义该 Listner:

muc.addParticipantStatusListener(new CustomParticipantStatusListner());

定义为(如果需要,有很多方法可以实现):

    public class CustomParticipantStatusListner extends DefaultParticipantStatusListener 
    {

        public void joined(String participant) 
        {
            System.out.println(participant + "just joined MUC");
//actions (add occupantsRightNow)
        }

        public void left(String participant)
        {
            System.out.println(participant + " just left MUC");
//actions (remove occupantsRightNow)
        }
    }

所有这一切都与 smack 4.1.7

【讨论】:

  • 我也是这样,当用户加入时,只有加入的方法被调用,但当用户离开房间时,左边的房间没有被调用....你能帮忙
【解决方案2】:

这是关于多用户聊天中的管理角色修改。 此示例展示了如何向访问者授予语音并监听通知事件:

// User1 creates a room
  muc = new MultiUserChat(conn1, "myroom@conference.jabber.org");
  muc.create("testbot");

  // User1 (which is the room owner) configures the room as a moderated room
  Form form = muc.getConfigurationForm();
  Form answerForm = form.createAnswerForm();
  answerForm.setAnswer("muc#roomconfig_moderatedroom", "1");
  muc.sendConfigurationForm(answerForm);

  // User2 joins the new room (as a visitor)
  MultiUserChat muc2 = new MultiUserChat(conn2, "myroom@conference.jabber.org");
  muc2.join("testbot2");
  // User2 will listen for his own "voice" notification events
  muc2.addUserStatusListener(new DefaultUserStatusListener() {
      public void voiceGranted() {
          super.voiceGranted();
          ...
      }
      public void voiceRevoked() {
          super.voiceRevoked();
          ...
      }
  });

  // User3 joins the new room (as a visitor)
  MultiUserChat muc3 = new MultiUserChat(conn3, "myroom@conference.jabber.org");
  muc3.join("testbot3");
  // User3 will lister for other occupants "voice" notification events
  muc3.addParticipantStatusListener(new DefaultParticipantStatusListener() {
      public void voiceGranted(String participant) {
          super.voiceGranted(participant);
          ...
      }

      public void voiceRevoked(String participant) {
          super.voiceRevoked(participant);
          ...
      }
  });

  // The room's owner grants voice to user2
  muc.grantVoice("testbot2"); 

详情可参考http://web.mit.edu/svalente/lib/smack_3_0_4/documentation/extensions/muc.html。

【讨论】:

    【解决方案3】:

    首先,加入一个聊天室:

    public MultiUserChat joinMultiUserChat(String user, String roomsName,
            String password) {
        if (getConnection() == null)
            return null;
        try {
            MultiUserChat muc = new MultiUserChat(getConnection(), roomsName
                    + "@conference." + getConnection().getServiceName());
            DiscussionHistory history = new DiscussionHistory();
            history.setMaxChars(0);
            // history.setSince(new Date());
            muc.join(user, password, history,
                    SmackConfiguration.getPacketReplyTimeout());
            Log.i("MultiUserChat", "Chat room【"+roomsName+"】joined........");
            return muc;
        } catch (XMPPException e) {
            e.printStackTrace();
            Log.i("MultiUserChat", "Chat room【"+roomsName+"】failed........");
            return null;
        }
    }
    

    然后,使用 MultiChatUser 发送消息:

    try {
        multiUserChat.sendMessage(message);
    } catch (XMPPException e) {
        e.printStackTrace();
    }
    

    添加监听器:

    import org.jivesoftware.smack.PacketListener;
    import org.jivesoftware.smack.packet.Message;
    import org.jivesoftware.smack.packet.Packet;
    
    public class TaxiMultiListener implements PacketListener {
        @Override
        public void processPacket(Packet packet) {
            Message message = (Message) packet;
            String body = message.getBody();
        }
    }
    

    最后,使用 MultiUserChat 调用 Listener:

    multiUserChat.addMessageListener(new TaxiMultiListener());
    

    【讨论】:

    • //ed 行是怎么回事?
    • 我指的是// history.setSince(new Date());。
    • 嗯,方法 setSince(java.util.Date since) 用于通过设置开始日期来过滤在那段时间收到的消息。换句话说,只有在指定日期时间之后收到的消息才会包含在历史记录中。更多细节可以参考 smack Javadoc(download.igniterealtime.org/smack/docs/latest/javadoc)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    相关资源
    最近更新 更多