代码之家  ›  专栏  ›  技术社区  ›  Abhishek Jha

多用户聊天中的smack状态侦听器

  •  3
  • Abhishek Jha  · 技术社区  · 8 年前

    多用户聊天中的smack状态侦听器未被调用。使用Smack Api登录,然后添加 花名册.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提供的许多链接,但都没有成功。 请帮帮我!

    3 回复  |  直到 8 年前
        1
  •  3
  •   MrPk    8 年前

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

    要知道谁在厕所里,首先要问一下住户:

    muc.join(user,password);
    
    List<String> occupantsAtJoinTime = muc.getOccupants();
    
                        for (String occupant : occupantsAtJoinTime)
                        {
                            System.out.println("occupant: "+occupant);
                            //actions
                        }
    

    然后,要更新占用者列表,请向muc注册DefaultParticipantStatusListener并定义该Listener:

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

    所有这一切都很糟糕4.1.7

        2
  •  0
  •   Kevin Chen    6 年前

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

    // 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
  •  0
  •   Z. Mei    6 年前

    首先,加入聊天室:

    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呼叫侦听器:

    multiUserChat.addMessageListener(new TaxiMultiListener());