Android smack 工具类(包含连接及相关方法)

public class XmppUtil {

	/**
	 * XMPP连接
	 */
	private static XMPPTCPConnection mXMPPConnection;

	/**
	 * 单聊管理器
	 */
	private static ChatManager mChatManager;

	/**
	 * smack ping openfire管理器
	 */
	private static PingManager mPingManager;

	/**
	 * 群聊管理器
	 */
	private static MultiUserChatManager multiUserChatManager;

	/**
	 * XMPP连接监听
	 */
	private static CheckConnectionListener checkConnectionListener;

	/**
	 * smack ping openfire失败监听
	 */
	private static PingServerFailedListener pingServerFailedListener;

	/**
	 * 单聊接收监听
	 */
	private static MsgListener msgListener;

	/**
	 * 单聊发送监听
	 */
	private static OutChatListener mOutChatListener;

	/**
	 * 监听邀请加入聊天室
	 */
	private static MucInvitationListener mucInvitationListener;

	/**
	 * 好友状态更新监听
	 */
	private static FriendsPacketListener friendsPacketListener;

	static {
		try {
			Class.forName("org.jivesoftware.smack.ReconnectionManager");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 *
	 * @return XMPPConnection是否连接并登陆
	 */
	public static boolean xmppIsConncetedAndLogin() {
		return mXMPPConnection != null && mXMPPConnection.isConnected() && mXMPPConnection.isAuthenticated();
	}

	/**
	 * 初始化XMPPConnection并建立连接
	 */
	public static synchronized void initXMPP() {
		// 已经连接并登陆上
		if (xmppIsConncetedAndLogin()) {
			return;
		} else {
//			disconnect(); // 先断开连接
			initXMPPConfig();
			connectXMPP();
		}
	}

	private static void initXMPPConfig() {
		try {
			SmackConfiguration.DEBUG = true;
			// 配置XmppConnection
			XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
					.setHostAddress(InetAddress.getByName(Const.XMPP_HOST)) // 设置openfire主机IP
					.setXmppDomain(Const.XMPP_DOMAIN)
					.setHost(Const.XMPP_HOST)
					.setPort(Const.XMPP_PORT)
					.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled) //禁用SSL连接
					.setCompressionEnabled(false)
					.setSendPresence(false) // 先设离线获取离线消息后再设在线
					.setCompressionEnabled(true) // 设置开启压缩,可以节省流量
					.setConnectTimeout(30000)
					.build();
			// 收到好友邀请后manual表示需要经过同意,accept_all表示不经同意自动为好友
			Roster.setDefaultSubscriptionMode(Roster.SubscriptionMode.accept_all);
			mXMPPConnection = new XMPPTCPConnection(config);
			//开启重联机制
			ReconnectionManager mReconnectionManager = ReconnectionManager.getInstanceFor(mXMPPConnection);
//			mReconnectionManager.setFixedDelay(5);
			mReconnectionManager.enableAutomaticReconnection();
		} catch (Exception e) {
			AppLog.debug(XmppUtil.class, "XMPP 配置失败---" + e.getMessage());
		}
	}

	/**
	 * 连接XMPP
	 */
	public static void connectXMPP() {
		try {
			mXMPPConnection.connect();
			AppLog.debug(XmppUtil.class, "XMPP连接结果---" + mXMPPConnection.isConnected());
			// 使用所有用户统一密码123,需要含参数Resourcepart.from("Smack"),不然每次自动分配一个名字,导致掉线重连的话在openfire看连接名称会变
			mXMPPConnection.login(UserConfig.getUserID(), "123", Resourcepart.from("Smack"));
			if(mXMPPConnection.isAuthenticated()){
				AppLog.debug(XmppUtil.class, "loginXMPP---success");
				BroadcastUtil.sendLoginBroadcast(true, false);
				//登录成功,设置用户的vcard信息,这个是为了记录昵称,可以不要
				VCard vCard = new VCard();
				vCard.setNickName(UserConfig.user.getName());
				VCardManager.getInstanceFor(mXMPPConnection).saveVCard(vCard);
				// 获取离线信息
				getOfflineMessage();
				//设置上线
				setPresence(0);//设置在线状态
				// 设置各种监听
				addListener();
			} else {
				AppLog.debug(XmppUtil.class, "loginXMPP----fail");
//				initXMPP();
			}
		} catch (Exception e) {
			AppLog.debug(XmppUtil.class, "XMPP connect--Exception---" + e.getMessage());
//			initXMPP();
		}
	}

	/**
	 * 添加各种监听
	 */
	private static void addListener() {
		//添加xmpp连接监听
		if (checkConnectionListener == null) {
			checkConnectionListener = new CheckConnectionListener();
		}
		mXMPPConnection.addConnectionListener(checkConnectionListener);
		// 添加聊天信息监听
		mChatManager = ChatManager.getInstanceFor(mXMPPConnection);
		if (msgListener == null) {
			msgListener = new MsgListener();
		}
		mChatManager.addIncomingListener(msgListener);
		// 单聊发出监听,估计是对方接收到了才会返回监听,发送是不会返回监听的
//		if (mOutChatListener == null) {
//			mOutChatListener = new OutChatListener();
//		}
//		mChatManager.addOutgoingListener(mOutChatListener);
		//监听邀请加入聊天室请求
		multiUserChatManager = MultiUserChatManager.getInstanceFor(mXMPPConnection);
		if (mucInvitationListener == null) {
			mucInvitationListener = new MucInvitationListener();
		}
		multiUserChatManager.addInvitationListener(mucInvitationListener);
		// 注册好友状态更新监听
		if (friendsPacketListener == null) {
			friendsPacketListener = new FriendsPacketListener();
		}
		StanzaFilter filter = new AndFilter();
		mXMPPConnection.addAsyncStanzaListener(friendsPacketListener, filter);
		// 自定义IQ请求获取群成员时,需要这个监听接收返回数据,请求在requireMatchUser()
		ProviderManager.addIQProvider(TAG_INFO, INFO_NAMESPACE, new ResponseAllMucMemberIQProvider());
		// 默认ping间隔 设为180秒
		mPingManager = PingManager.getInstanceFor(mXMPPConnection);
		mPingManager.setPingInterval(180);
		if (pingServerFailedListener == null) {
			pingServerFailedListener = new PingServerFailedListener();
		}
		mPingManager.registerPingFailedListener(pingServerFailedListener);
	}

	/**
	 * 获取离线消息
	 *
	 * @return
	 */
	private static Map<String, List<HashMap<String, String>>> getOfflineMessage() {
		if (mXMPPConnection == null) {
			return null;
		}
		Map<String, List<HashMap<String, String>>> offlineMsgs = null;
		try {
			OfflineMessageManager offlineManager = new OfflineMessageManager(mXMPPConnection);
			List<Message> messageList = offlineManager.getMessages();

			int count = offlineManager.getMessageCount();
			if (count <= 0) {
				return null;
			}
			offlineMsgs = new HashMap<>();

			for (Message message : messageList) {
				// TODO 根据实际处理
			}
			offlineManager.deleteMessages();

		} catch (Exception e) {
			AppLog.debug(XmppUtil.class, "---getOfflineMessage---" + e.getMessage());
		}
		return offlineMsgs;
	}



	public static void disconnect() {
		if (mXMPPConnection != null) {
			// 移除连接监听
			/*if (checkConnectionListener != null) {
				mXMPPConnection.removeConnectionListener(checkConnectionListener);
			}
			if (mPingManager != null && pingServerFailedListener != null) {
				mPingManager.unregisterPingFailedListener(pingServerFailedListener);
//				mPingManager = null;
			}
			if (mChatManager != null && msgListener != null) {
				mChatManager.removeListener(msgListener);
//				mChatManager = null;
			}
			if (multiUserChatManager != null && mucInvitationListener != null) {
				multiUserChatManager.removeInvitationListener(mucInvitationListener);
//				multiUserChatManager = null;
			}*/
			if (mXMPPConnection.isConnected()) {
				mXMPPConnection.disconnect();
				mXMPPConnection = null;
			}
		}
	}

    
	 /** 
     * 更改用户状态 
     */  
    public static void setPresence(int code) {
        Presence presence=null;
        try {
			switch (code) {
			case 0:
				presence = new Presence(Presence.Type.available);  //在线
				break;
			case 1:
				presence = new Presence(Presence.Type.available);  //设置Q我吧
				presence.setMode(Presence.Mode.chat);
				break;
			case 2:                                                                                      //隐身
//				Roster roster = Roster.getInstanceFor(mXMPPConnection);
//				Collection<RosterEntry> entries = roster.getEntries();
//				for (RosterEntry entry : entries) {
//					presence = new Presence(Presence.Type.unavailable);
//					presence.setPacketID(Packet.ID_NOT_AVAILABLE);
//					presence.setFrom(mXMPPConnection.getUser());
//					presence.setTo(entry.getUser());
//				}
//				// 向同一用户的其他客户端发送隐身状态
//				presence = new Presence(Presence.Type.unavailable);
//				presence.setPacketID(Packet.ID_NOT_AVAILABLE);
//				presence.setFrom(mXMPPConnection.getUser());
//				presence.setTo(StringUtils.parseBareAddress(mXMPPConnection.getUser()));
				break;
			case 3:
				presence = new Presence(Presence.Type.available);  //设置忙碌
				presence.setMode(Presence.Mode.dnd);
				break;
			case 4:
				presence = new Presence(Presence.Type.available);  //设置离开
				presence.setMode(Presence.Mode.away);
				break;
			case 5:
				presence = new Presence(Presence.Type.unavailable);  //离线
				break;
			default:
				break;
			}
			if(presence!=null){
				mXMPPConnection.sendStanza(presence);
			}
		} catch (SmackException.NotConnectedException | InterruptedException e) {
			AppLog.debug(XmppUtil.class, "setPresence---" + e.getMessage());
		}
    }  
	/** 
     * 删除当前用户 
     * @param connection 
     * @return 
     */  
    public static boolean deleteAccount(XMPPConnection connection) {
		if (mXMPPConnection == null)
			return false;
		try {
			AccountManager.getInstance(connection).deleteAccount();
			return true;
		} catch (XMPPException | SmackException | InterruptedException e) {
			e.printStackTrace();
			return false;
		}

	}
	/**
	 * 返回所有组信息 <RosterGroup>
	 * @return List(RosterGroup)
	 */
	public static List<RosterGroup> getGroups() {
		if (mXMPPConnection == null) {
			return null;
		}
		List<RosterGroup> groupsList = new ArrayList<RosterGroup>();
		Collection<RosterGroup> rosterGroup = Roster.getInstanceFor(mXMPPConnection).getGroups();
		Iterator<RosterGroup> i = rosterGroup.iterator();
		while (i.hasNext())
			groupsList.add(i.next());
		return groupsList;
	}

	/**
	 * 返回相应(groupName)组里的所有用户<RosterEntry>
	 * @return List(RosterEntry)
	 */
	public static List<RosterEntry> getEntriesByGroup(String groupName) {
		if (mXMPPConnection == null) {
			return null;
		}
		List<RosterEntry> EntriesList = new ArrayList<>();
		RosterGroup rosterGroup = Roster.getInstanceFor(mXMPPConnection).getGroup(groupName);
		Collection<RosterEntry> rosterEntry = rosterGroup.getEntries();
		for (RosterEntry aRosterEntry : rosterEntry) {
			EntriesList.add(aRosterEntry);
		}
		return EntriesList;
	}

	/**
	 * 获取所有好友信息
	 *
	 * @return List<RosterEntry>
	 */
	public List<RosterEntry> getAllEntries() {
		if (mXMPPConnection == null) {
			return null;
		}
		List<RosterEntry> Enlist = new ArrayList<>();
		Collection<RosterEntry> rosterEntry = Roster.getInstanceFor(mXMPPConnection).getEntries();
		for (RosterEntry aRosterEntry : rosterEntry) {
			Enlist.add(aRosterEntry);
		}
		return Enlist;
	}
	
	
	/** 
     * 创建一个组 
     */ 
	public static boolean addGroup(String groupName)
    {  
        try {
			Roster.getInstanceFor(mXMPPConnection).createGroup(groupName);
            return true;  
        } catch (Exception e) {  
            e.printStackTrace();  
            Log.e("jj", "创建分组异常:"+e.getMessage());
            return false;  
        }  
    }  
      
    /** 
     * 删除一个组 
     */  
    public static boolean removeGroup(Roster roster,String groupName)  
    {  
        return false;  
    }

	/**
	 * 添加好友 无分组
	 *
	 * @param userName userName
	 * @param name     name
	 * @return boolean
	 */
	public static boolean addUser(String userName,String name) {
		if (mXMPPConnection == null) {
			return false;
		}
		try {
			Roster.getInstanceFor(mXMPPConnection).createEntry(
					JidCreate.entityBareFrom(userName), name, null);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		
	}

	/**
	 * 添加好友 有分组
	 *
	 * @param name      name
	 * @param groupName groupName
	 * @return boolean
	 */
	public static boolean addUsers(String userName, String name,String groupName)
	{
		try {
			Presence subscription = new Presence(Presence.Type.subscribed);
			subscription.setTo(JidCreate.entityBareFrom(userName));
			userName += "@" + mXMPPConnection.getServiceName();
			mXMPPConnection.sendStanza(subscription);
			Roster.getInstanceFor(mXMPPConnection).createEntry(JidCreate.entityBareFrom(userName), name,
					new String[]{groupName});
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			Log.e("jj", "添加好友异常:"+e.getMessage());
			return false;
		}
		
	}

	/**
	 * 删除好友
	 *
	 * @param userName userName
	 * @return boolean
	 */
	public boolean removeUser(String userName) {
		if (mXMPPConnection == null)
			return false;
		try {
			RosterEntry entry = null;
			if (userName.contains("@")) {
				entry = Roster.getInstanceFor(mXMPPConnection).getEntry(JidCreate.entityBareFrom(userName));
			} else {
				entry = Roster.getInstanceFor(mXMPPConnection).getEntry(JidCreate.entityBareFrom(
						userName + "@" + mXMPPConnection.getServiceName()));
			}
			if (entry == null) {
				entry = Roster.getInstanceFor(mXMPPConnection).getEntry(JidCreate.entityBareFrom(userName));
			}
			Roster.getInstanceFor(mXMPPConnection).removeEntry(entry);

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	
	/**
     * 把一个好友添加到一个组中
     * @param userJid
     * @param groupName
     */
    public static void addUserToGroup(final String userJid, final String groupName) {
			try {
				RosterGroup group = Roster.getInstanceFor(mXMPPConnection).getGroup(groupName);
				// 这个组已经存在就添加到这个组,不存在创建一个组
				RosterEntry entry = Roster.getInstanceFor(mXMPPConnection).getEntry(JidCreate.bareFrom(userJid));
				if (group != null) {
					if (entry != null)
						group.addEntry(entry);
				} else {
					RosterGroup newGroup = Roster.getInstanceFor(mXMPPConnection).createGroup("我的好友");
					if (entry != null)
						newGroup.addEntry(entry);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
    }

    /**
     * 把一个好友从组中删除
     * @param userJid
     * @param groupName
     */
    public static void removeUserFromGroup(final String userJid,final String groupName) {
            RosterGroup group = Roster.getInstanceFor(mXMPPConnection).getGroup(groupName);
            if (group != null) {
                try {
                	RosterEntry entry = Roster.getInstanceFor(mXMPPConnection).getEntry(JidCreate.bareFrom(userJid));
                    if (entry != null)
                        group.removeEntry(entry);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
     }
    
    /** 
     * 修改签名
     */  
    public static void changeSign(int code , String content){
    	try {
			Presence presence = getOnlineStatus(code);
			presence.setStatus(content);
			mXMPPConnection.sendStanza(presence);
		} catch (Exception e) {
			AppLog.debug(XmppUtil.class, "changeSign---" + e.getMessage());
		}
    }
    
    
    /**
	 * 发送消息
	 * @param content
	 * @param touser
	 * @throws XMPPException
	 */
	public static void sendMessage(String content, String touser) throws XmppStringprepException,
			SmackException.NotConnectedException, InterruptedException{
		if(mXMPPConnection == null || !mXMPPConnection.isConnected() || !mXMPPConnection.isAuthenticated()){
			throw new SmackException.NotConnectedException();
		}
//		ChatManager chatmanager = mXMPPConnection.getChatManager();
        Chat chat = ChatManager.getInstanceFor(mXMPPConnection).
				chatWith(JidCreate.entityBareFrom(touser + "@" + Const.XMPP_DOMAIN));
		if (chat != null) {
			chat.send(content);
			Log.e("jj", "发送成功");
		}
	}
	
	public static void setOnlineStatus(ImageView iv_stutas,int code,TextView tv_stutas,String[] items ){
		switch (code) {
		case 0://在线
			iv_stutas.setImageResource(R.drawable.func_chat_person_status_evk);
			tv_stutas.setText(items[0]);
			break;
		case 1://q我吧
			iv_stutas.setImageResource(R.drawable.func_chat_person_status_evm);
			tv_stutas.setText(items[1]);
			break;
		case 2://隐身
			iv_stutas.setImageResource(R.drawable.func_chat_person_status_evf);
			tv_stutas.setText(items[2]);
			break;
		case 3://忙碌
			iv_stutas.setImageResource(R.drawable.func_chat_person_status_evd);
			tv_stutas.setText(items[3]);
			break;
		case 4://离开
			iv_stutas.setImageResource(R.drawable.func_chat_person_status_evp);
			tv_stutas.setText(items[4]);
			break;
		default:
			break;
		}
		
	}
	
	public static Presence getOnlineStatus(int code){
		Presence presence=null;
		  switch (code) {  
	        case 0:  
	            presence = new Presence(Presence.Type.available);  //在线
	            break;  
	        case 1:  
	            presence = new Presence(Presence.Type.available);  //设置Q我吧
	            presence.setMode(Presence.Mode.chat);  
	            break;  
	        case 2:                                                                                      //隐身
	            presence = new Presence(Presence.Type.unavailable);  
	            break;  
	        case 3:  
	            presence = new Presence(Presence.Type.available);  //设置忙碌
	            presence.setMode(Presence.Mode.dnd);  
	            break;  
	        case 4:  
	            presence = new Presence(Presence.Type.available);  //设置离开
	            presence.setMode(Presence.Mode.away);  
	            break;  
	        case 5:  
	            presence = new Presence(Presence.Type.unavailable);  //离线
	            break;  
	        default:  
	            break;  
	        }  
		return presence;
	}

	/**
	 * 创建聊组
	 * @param user 用户id
	 * @param roomName 房间名
	 * @param password 房间密码
	 * @return
	 */
	public static MultiUserChat createRoom(String user, String roomName, String password){

		if (mXMPPConnection == null){
			return null;
		}
		MultiUserChat muc = null;
		try {
			// 创建一个MultiUserChat 参数(XmppConnection,群全称)
			muc = MultiUserChatManager.getInstanceFor(mXMPPConnection)
					.getMultiUserChat(JidCreate.entityBareFrom(roomName
					+ "@conference." + mXMPPConnection.getServiceName()));
			// 创建聊天室
			muc.create(Resourcepart.from(roomName));
			// 获得聊天室的配置表单
			Form form = muc.getConfigurationForm();
			// 根据原始表单创建一个要提交的新表单。
			Form submitForm = form.createAnswerForm();
			// 向要提交的表单添加默认答复
			for (FormField formField : form.getFields()) {
				if (FormField.Type.hidden == formField.getType()
						&& formField.getVariable() != null) {
					// 设置默认值作为答复
					submitForm.setDefaultAnswer(formField.getVariable());
				}
			}
			// 设置聊天室的新拥有者
			List<String> owners = new ArrayList<>();
			owners.add(mXMPPConnection.getUser().asEntityBareJidString()); // 用户JID
			submitForm.setAnswer("muc#roomconfig_roomowners", owners);
			// 设置聊天室是持久聊天室,即将要被保存下来
			submitForm.setAnswer("muc#roomconfig_persistentroom", true);
			// 房间仅对成员开放
			submitForm.setAnswer("muc#roomconfig_membersonly", false);
			// 允许占有者邀请其他人
			submitForm.setAnswer("muc#roomconfig_allowinvites", true);
			//允许占有者更改主题
			submitForm.setAnswer("muc#roomconfig_changesubject",true);

			//设置房间最大用户数
			List<String> maxusers = new ArrayList<String>();
			maxusers.add("50");
			submitForm.setAnswer("muc#roomconfig_maxusers", maxusers);

			if (!password.equals("123")) {
				// 进入是否需要密码
				submitForm.setAnswer("muc#roomconfig_passwordprotectedroom",
						true);
				// 设置进入密码
				submitForm.setAnswer("muc#roomconfig_roomsecret", password);
			}
			// 能够发现占有者真实 JID 的角色
			// submitForm.setAnswer("muc#roomconfig_whois", "anyone");
			// 登录房间对话
			submitForm.setAnswer("muc#roomconfig_enablelogging", true);
			// 仅允许注册的昵称登录
			submitForm.setAnswer("x-muc#roomconfig_reservednick", true);
			// 允许使用者修改昵称
			submitForm.setAnswer("x-muc#roomconfig_canchangenick", false);
			// 允许用户注册房间
			submitForm.setAnswer("x-muc#roomconfig_registration", false);
			// 发送已完成的表单(有默认值)到服务器来配置聊天室
			muc.sendConfigurationForm(submitForm);
		} catch (Exception e) {
			e.printStackTrace();
			muc = null;
		}
		return muc;

	}

	/**
	 * 加入聊天室
	 * @param user 用户名,不是jid,例如:用户66@192.168.1.1,是前面的66
	 * @param password 房间的密码
	 * @param roomsName 房间的名字
	 */
	public static MultiUserChat joinMultiUserChat(String user, String password, String roomsName) {
		try {
			// 使用XMPPConnection创建一个MultiUserChat窗口
			MultiUserChat muc = MultiUserChatManager.getInstanceFor(mXMPPConnection)
					.getMultiUserChat(JidCreate.entityBareFrom(roomsName
							+ "@conference." + mXMPPConnection.getServiceName()));
			// 聊天室配置
			MucEnterConfiguration.Builder builder = muc.getEnterConfigurationBuilder(Resourcepart.from(user));
			builder.withPassword(password);
			// 加入时不发送历史
//			builder.requestNoHistory();
			// 加入时发送99条历史,为了获取离线群消息,保存时会去重,这种方案也有弊端
			builder.requestMaxStanzasHistory(99);
			MucEnterConfiguration mMucEnterConfiguration = builder.build();
			// 用户加入聊天室 参数()
			muc.join(mMucEnterConfiguration);
			System.out.println("会议室加入成功........");
			return muc;
		} catch (XMPPException | XmppStringprepException | InterruptedException | SmackException e) {
			e.printStackTrace();
			System.out.println("会议室加入失败........");
			//muc = null;
			return null;
		}

	}

	/**
	 * 获取用户VCard信息
	 * @param user 为jid 如:123@localhost tuo
	 * @return
	 * @throws XMPPException
	 */
	public static VCard getUserVCard(String user) {
		if (mXMPPConnection == null) {
			return null;
		}
		VCard vcard = new VCard();
		try {
			vcard = VCardManager.getInstanceFor(mXMPPConnection).loadVCard(JidCreate.entityBareFrom(user));
		} catch (Exception e) {
			e.printStackTrace();
		}
		return vcard;
	}

	/**
	 * 遍历每个人所创建的群
	 * @return 遍历每个人所创建的群
	 * @throws XMPPException XMPPException
	 */
	public static List<HostedRoom> getHostedRooms() throws XMPPException{
		if (mXMPPConnection == null) {
			return null;
		}
		Collection<HostedRoom> hostrooms;
		List<HostedRoom> roominfos = new ArrayList<>();
		try {
			hostrooms = MultiUserChatManager.getInstanceFor(mXMPPConnection)
					.getHostedRooms(JidCreate.domainBareFrom("@conference." + mXMPPConnection.getServiceName()));
			for (HostedRoom entry : hostrooms) {
				roominfos.add(entry);
				Log.i("room", "名字:" + entry.getName() + " - ID:" + entry.getJid());
			}
			Log.i("room", "服务会议数量:" + roominfos.size());
		} catch (XMPPException | XmppStringprepException | InterruptedException | SmackException e) {
			e.printStackTrace();
			return null;
		}
		return roominfos;
	}

	/**
	 * 获取人员花名册
	 * @return 人员花名册
	 */
	public static Roster getRoster () {
		return Roster.getInstanceFor(mXMPPConnection);
	}

	/**
	 * 获取XMPPConnection服务名字
	 * @return MPPConnection服务名字
	 */
	public static DomainBareJid getXMPPConnectionServiceName() {
		return mXMPPConnection.getServiceName();
	}

	/**
	 * 请求时XML的子节点名字
	 */
	public static final String TAG_INFO = "info";

	/**
	 * openfire插件名字
	 */
	public static final String MATCH_USER_PLUGIN_NAME = "getMucAllMember";

	/**
	 * 请求时携带的类型,可以理解为接口名
	 */
	public static final String GET_MUC_ALL_MEMBERS = "get_muc_all_members";

	/**
	 * 请求的空间名
	 */
	public static  final  String INFO_NAMESPACE = "match:iq:info";

	/**
	 * 请求获取群所有成员,需要配合openfire插件mucPlugin和getMucAllMember一起使用
	 * 自定义请求第一步,第二步在RequestAllMucMemberByRoomJidIQ
	 * 这个请求需要在xmpp连接时增加ProviderManager.addIQProvider(TAG_INFO, INFO_NAMESPACE, new ResponseAllMucMemberIQProvider());
	 * @param roomName 群名称,建群时那个(openfire服务器ofmucroom表中的name字段)
	 */
	public static void requireMatchUser(String roomName){
		try {
			RequestAllMucMemberByRoomJidIQ msg = new RequestAllMucMemberByRoomJidIQ(TAG_INFO);
			// 谁请求的
			msg.setFrom(mXMPPConnection.getUser());
			// 发送给openfire的哪个插件,MATCH_USER_PLUGIN_NAME是插件的名称
			msg.setTo(JidCreate.from(mXMPPConnection.getServiceName() + "/" + MATCH_USER_PLUGIN_NAME));
			msg.setData(roomName);
			msg.setMsgType(GET_MUC_ALL_MEMBERS);
			mXMPPConnection.sendStanza(msg);
			// 增加过滤限制,只接收这个号发送出去的RequestAllMucMemberByRoomJidIQ请求
			StanzaFilter filter = new AndFilter( new StanzaTypeFilter(RequestAllMucMemberByRoomJidIQ.class),
					ToMatchesFilter.create(mXMPPConnection.getUser()));
			mXMPPConnection.addSyncStanzaListener(stanzaListener,filter);
			mXMPPConnection.addSyncStanzaListener(errorStanzaListener,errorFilter);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			AppLog.debug(XmppUtil.class, "获取群成员-----" + e.getMessage());
		}
	}

	/**
	 * 自定义请求的返回监听
	 */
	private static StanzaListener stanzaListener = new StanzaListener() {
		@Override
		public void processStanza(Stanza packet) {
			// TODO Auto-generated method stub
			RequestAllMucMemberByRoomJidIQ iq = (RequestAllMucMemberByRoomJidIQ)packet;
			String roomName = iq.getData();
			List<Child> childList = iq.getChildList();
			MucUtil.mucMembers.put(roomName, childList);
			// 发送获取群聊成员完成广播
			MucAllMembersReceive mucAllMembersReceive = new MucAllMembersReceive();
			mucAllMembersReceive.setRoomName(roomName);
			mucAllMembersReceive.setChildList(childList);
			EventBus.getDefault().post(mucAllMembersReceive);
		}
	};
	/**
	 * 错误
	 */
	private static StanzaListener errorStanzaListener = new StanzaListener() {

		@Override
		public void processStanza(Stanza packet) {
			// TODO Auto-generated method stub
			RequestAllMucMemberByRoomJidIQ iq = (RequestAllMucMemberByRoomJidIQ)packet;
		}
	};

	/**
	 * 错误过滤器
	 */
	private static StanzaFilter errorFilter = new StanzaFilter() {
		@Override
		public boolean accept(Stanza stanza) {
			if(stanza instanceof IQ)
			{
				if (((IQ) stanza).getType().equals("error"))
					return true;
			}
			return  false;
		}
	};

	

}

 

上一篇:读代码:Presence


下一篇:VS平台下MT与MD的区别