在多用户聊天中打状态侦听器



多用户聊天中没有被调用的状态侦听器。使用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);
        }
    }

我尝试了许多堆栈溢出提供的链接,但没有得到任何成功。请帮忙!

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

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

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

然后,要保持占用者列表的更新,请将 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

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

// 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 中参考。

首先,加入聊天室:

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

然后,使用多聊天用户发送消息:

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.addMessageListener(new TaxiMultiListener());

最新更新