Android 基于XMPP Smack Openfire 总结
不管学习什么都应该总结
这里我把关于Xmpp的一些方法整理到一个工具类中了
我就分享给大家
import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.ByteArrayInputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;import java.net.URL;import java.net.URLConnection;import java.util.ArrayList;import java.util.Collection;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import org.jivesoftware.smack.ConnectionConfiguration;import org.jivesoftware.smack.PacketCollector;import org.jivesoftware.smack.Roster;import org.jivesoftware.smack.RosterEntry;import org.jivesoftware.smack.RosterGroup;import org.jivesoftware.smack.SmackConfiguration;import org.jivesoftware.smack.XMPPConnection;import org.jivesoftware.smack.XMPPException;import org.jivesoftware.smack.filter.AndFilter;import org.jivesoftware.smack.filter.PacketFilter;import org.jivesoftware.smack.filter.PacketIDFilter;import org.jivesoftware.smack.filter.PacketTypeFilter;import org.jivesoftware.smack.packet.IQ;import org.jivesoftware.smack.packet.Message;import org.jivesoftware.smack.packet.Packet;import org.jivesoftware.smack.packet.Presence;import org.jivesoftware.smack.packet.Registration;import org.jivesoftware.smack.provider.PrivacyProvider;import org.jivesoftware.smack.provider.ProviderManager;import org.jivesoftware.smack.util.StringUtils;import org.jivesoftware.smackx.Form;import org.jivesoftware.smackx.FormField;import org.jivesoftware.smackx.GroupChatInvitation;import org.jivesoftware.smackx.OfflineMessageManager;import org.jivesoftware.smackx.PrivateDataManager;import org.jivesoftware.smackx.ReportedData;import org.jivesoftware.smackx.ReportedData.Row;import org.jivesoftware.smackx.ServiceDiscoveryManager;import org.jivesoftware.smackx.bytestreams.socks5.provider.BytestreamsProvider;import org.jivesoftware.smackx.filetransfer.FileTransferManager;import org.jivesoftware.smackx.filetransfer.OutgoingFileTransfer;import org.jivesoftware.smackx.muc.DiscussionHistory;import org.jivesoftware.smackx.muc.HostedRoom;import org.jivesoftware.smackx.muc.MultiUserChat;import org.jivesoftware.smackx.packet.ChatStateExtension;import org.jivesoftware.smackx.packet.LastActivity;import org.jivesoftware.smackx.packet.OfflineMessageInfo;import org.jivesoftware.smackx.packet.OfflineMessageRequest;import org.jivesoftware.smackx.packet.SharedGroupsInfo;import org.jivesoftware.smackx.packet.VCard;import org.jivesoftware.smackx.provider.AdHocCommandDataProvider;import org.jivesoftware.smackx.provider.DataFormProvider;import org.jivesoftware.smackx.provider.DelayInformationProvider;import org.jivesoftware.smackx.provider.DiscoverInfoProvider;import org.jivesoftware.smackx.provider.DiscoverItemsProvider;import org.jivesoftware.smackx.provider.MUCAdminProvider;import org.jivesoftware.smackx.provider.MUCOwnerProvider;import org.jivesoftware.smackx.provider.MUCUserProvider;import org.jivesoftware.smackx.provider.MessageEventProvider;import org.jivesoftware.smackx.provider.MultipleAddressesProvider;import org.jivesoftware.smackx.provider.RosterExchangeProvider;import org.jivesoftware.smackx.provider.StreamInitiationProvider;import org.jivesoftware.smackx.provider.VCardProvider;import org.jivesoftware.smackx.provider.XHTMLExtensionProvider;import org.jivesoftware.smackx.search.UserSearch;import org.jivesoftware.smackx.search.UserSearchManager;import android.graphics.drawable.Drawable;import android.util.Log;import com.techrare.listener.TaxiConnectionListener;/** * XmppConnection 工具类 * @author iaiai * */public class XmppConnection {private int SERVER_PORT = 5222;private String SERVER_HOST = "127.0.0.1";private XMPPConnection connection = null;private String SERVER_NAME = "ubuntuserver4java";private static XmppConnection xmppConnection = new XmppConnection();private TaxiConnectionListener connectionListener;/** * 单例模式 * * @return */synchronized public static XmppConnection getInstance() {return xmppConnection;}/** * 创建连接 */public XMPPConnection getConnection() {if (connection == null) {openConnection();}return connection;}/** * 打开连接 */public boolean openConnection() {try {if (null == connection || !connection.isAuthenticated()) {XMPPConnection.DEBUG_ENABLED = true;// 开启DEBUG模式// 配置连接ConnectionConfiguration config = new ConnectionConfiguration(SERVER_HOST, SERVER_PORT, SERVER_NAME);config.setReconnectionAllowed(true);config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);config.setSendPresence(true); // 状态设为离线,目的为了取离线消息config.setSASLAuthenticationEnabled(false); // 是否启用安全验证config.setTruststorePath("/system/etc/security/cacerts.bks");config.setTruststorePassword("changeit");config.setTruststoreType("bks");connection = new XMPPConnection(config);connection.connect();// 连接到服务器// 配置各种Provider,如果不配置,则会无法解析数据configureConnection(ProviderManager.getInstance());return true;}} catch (XMPPException xe) {xe.printStackTrace();connection = null;}return false;}/** * 关闭连接 */public void closeConnection() {if(connection!=null){//移除連接監聽 //connection.removeConnectionListener(connectionListener);if(connection.isConnected())connection.disconnect();connection = null;}Log.i("XmppConnection", "關閉連接");}/** * 登录 * * @param account * 登录帐号 * @param password * 登录密码 * @return */public boolean login(String account, String password) {try {if (getConnection() == null)return false;getConnection().login(account, password);// 更改在綫狀態Presence presence = new Presence(Presence.Type.available);getConnection().sendPacket(presence);// 添加連接監聽connectionListener = new TaxiConnectionListener();getConnection().addConnectionListener(connectionListener);return true;} catch (XMPPException xe) {xe.printStackTrace();}return false;}/** * 注册 * * @param account * 注册帐号 * @param password * 注册密码 * @return 1、注册成功 0、服务器没有返回结果2、这个账号已经存在3、注册失败 */public String regist(String account, String password) {if (getConnection() == null)return "0";Registration reg = new Registration();reg.setType(IQ.Type.SET);reg.setTo(getConnection().getServiceName());// 注意这里createAccount注册时,参数是UserName,不是jid,是"@"前面的部分。reg.setUsername(account);reg.setPassword(password);// 这边addAttribute不能为空,否则出错。所以做个标志是android手机创建的吧!!!!!reg.addAttribute("android", "geolo_createUser_android");PacketFilter filter = new AndFilter(new PacketIDFilter(reg.getPacketID()), new PacketTypeFilter(IQ.class));PacketCollector collector = getConnection().createPacketCollector(filter);getConnection().sendPacket(reg);IQ result = (IQ) collector.nextResult(SmackConfiguration.getPacketReplyTimeout());// Stop queuing results停止请求results(是否成功的结果)collector.cancel();if (result == null) {Log.e("regist", "No response from server.");return "0";} else if (result.getType() == IQ.Type.RESULT) {Log.v("regist", "regist success.");return "1";} else { // if (result.getType() == IQ.Type.ERROR)if (result.getError().toString().equalsIgnoreCase("conflict(409)")) {Log.e("regist", "IQ.Type.ERROR: "+ result.getError().toString());return "2";} else {Log.e("regist", "IQ.Type.ERROR: "+ result.getError().toString());return "3";}}}/** * 更改用户状态 */public void setPresence(int code) {XMPPConnection con = getConnection();if (con == null)return;Presence presence;switch (code) {case 0:presence = new Presence(Presence.Type.available);con.sendPacket(presence);Log.v("state", "设置在线");break;case 1:presence = new Presence(Presence.Type.available);presence.setMode(Presence.Mode.chat);con.sendPacket(presence);Log.v("state", "设置Q我吧");break;case 2:presence = new Presence(Presence.Type.available);presence.setMode(Presence.Mode.dnd);con.sendPacket(presence);Log.v("state", "设置忙碌");break;case 3:presence = new Presence(Presence.Type.available);presence.setMode(Presence.Mode.away);con.sendPacket(presence);Log.v("state", "设置离开");break;case 4:Roster roster = con.getRoster();Collection<RosterEntry> entries = roster.getEntries();for (RosterEntry entry : entries) {presence = new Presence(Presence.Type.unavailable);presence.setPacketID(Packet.ID_NOT_AVAILABLE);presence.setFrom(con.getUser());presence.setTo(entry.getUser());con.sendPacket(presence);Log.v("state", presence.toXML());}// 向同一用户的其他客户端发送隐身状态presence = new Presence(Presence.Type.unavailable);presence.setPacketID(Packet.ID_NOT_AVAILABLE);presence.setFrom(con.getUser());presence.setTo(StringUtils.parseBareAddress(con.getUser()));con.sendPacket(presence);Log.v("state", "设置隐身");break;case 5:presence = new Presence(Presence.Type.unavailable);con.sendPacket(presence);Log.v("state", "设置离线");break;default:break;}}/** * 获取所有组 * * @return 所有组集合 */public List<RosterGroup> getGroups() {if (getConnection() == null)return null;List<RosterGroup> grouplist = new ArrayList<RosterGroup>();Collection<RosterGroup> rosterGroup = getConnection().getRoster().getGroups();Iterator<RosterGroup> i = rosterGroup.iterator();while (i.hasNext()) {grouplist.add(i.next());}return grouplist;}/** * 获取某个组里面的所有好友 * * @param roster * @param groupName * 组名 * @return */public List<RosterEntry> getEntriesByGroup(String groupName) {if (getConnection() == null)return null;List<RosterEntry> Entrieslist = new ArrayList<RosterEntry>();RosterGroup rosterGroup = getConnection().getRoster().getGroup(groupName);Collection<RosterEntry> rosterEntry = rosterGroup.getEntries();Iterator<RosterEntry> i = rosterEntry.iterator();while (i.hasNext()) {Entrieslist.add(i.next());}return Entrieslist;}/** * 获取所有好友信息 * * @return */public List<RosterEntry> getAllEntries() {if (getConnection() == null)return null;List<RosterEntry> Entrieslist = new ArrayList<RosterEntry>();Collection<RosterEntry> rosterEntry = getConnection().getRoster().getEntries();Iterator<RosterEntry> i = rosterEntry.iterator();while (i.hasNext()) {Entrieslist.add(i.next());}return Entrieslist;}/** * 获取用户VCard信息 * * @param connection * @param user * @return * @throws XMPPException */public VCard getUserVCard(String user) {if (getConnection() == null)return null;VCard vcard = new VCard();try {vcard.load(getConnection(), user);} catch (XMPPException e) {e.printStackTrace();}return vcard;}/** * 获取用户头像信息 * * @param connection * @param user * @return */public Drawable getUserImage(String user) {if (getConnection() == null)return null;ByteArrayInputStream bais = null;try {VCard vcard = new VCard();// 加入这句代码,解决No VCard forProviderManager.getInstance().addIQProvider("vCard", "vcard-temp",new org.jivesoftware.smackx.provider.VCardProvider());if (user == "" || user == null || user.trim().length() <= 0) {return null;}vcard.load(getConnection(), user + "@"+ getConnection().getServiceName());if (vcard == null || vcard.getAvatar() == null)return null;bais = new ByteArrayInputStream(vcard.getAvatar());} catch (Exception e) {e.printStackTrace();return null;}return FormatTools.getInstance().InputStream2Drawable(bais);}/** * 添加一个分组 * * @param groupName * @return */public boolean addGroup(String groupName) {if (getConnection() == null)return false;try {getConnection().getRoster().createGroup(groupName);Log.v("addGroup", groupName + "創建成功");return true;} catch (Exception e) {e.printStackTrace();return false;}}/** * 删除分组 * * @param groupName * @return */public boolean removeGroup(String groupName) {return true;}/** * 添加好友 无分组 * * @param userName * @param name * @return */public boolean addUser(String userName, String name) {if (getConnection() == null)return false;try {getConnection().getRoster().createEntry(userName, name, null);return true;} catch (Exception e) {e.printStackTrace();return false;}}/** * 添加好友 有分组 * * @param userName * @param name * @param groupName * @return */public boolean addUser(String userName, String name, String groupName) {if (getConnection() == null)return false;try {Presence subscription = new Presence(Presence.Type.subscribed);subscription.setTo(userName);userName += "@" + getConnection().getServiceName();getConnection().sendPacket(subscription);getConnection().getRoster().createEntry(userName, name,new String[] { groupName });return true;} catch (Exception e) {e.printStackTrace();return false;}}/** * 删除好友 * * @param userName * @return */public boolean removeUser(String userName) {if (getConnection() == null)return false;try {RosterEntry entry = null;if (userName.contains("@"))entry = getConnection().getRoster().getEntry(userName);elseentry = getConnection().getRoster().getEntry(userName + "@" + getConnection().getServiceName());if (entry == null)entry = getConnection().getRoster().getEntry(userName);getConnection().getRoster().removeEntry(entry);return true;} catch (Exception e) {e.printStackTrace();return false;}}/** * 查询用户 * * @param userName * @return * @throws XMPPException */public List<HashMap<String, String>> searchUsers(String userName) {if (getConnection() == null)return null;HashMap<String, String> user = null;List<HashMap<String, String>> results = new ArrayList<HashMap<String, String>>();try {new ServiceDiscoveryManager(getConnection());UserSearchManager usm = new UserSearchManager(getConnection());Form searchForm = usm.getSearchForm(getConnection().getServiceName());Form answerForm = searchForm.createAnswerForm();answerForm.setAnswer("userAccount", true);answerForm.setAnswer("userPhote", userName);ReportedData data = usm.getSearchResults(answerForm, "search"+ getConnection().getServiceName());Iterator<Row> it = data.getRows();Row row = null;while (it.hasNext()) {user = new HashMap<String, String>();row = it.next();user.put("userAccount", row.getValues("userAccount").next().toString());user.put("userPhote", row.getValues("userPhote").next().toString());results.add(user);// 若存在,则有返回,UserName一定非空,其他两个若是有设,一定非空}} catch (XMPPException e) {e.printStackTrace();}return results;}/** * 修改心情 * * @param connection * @param status */public void changeStateMessage(String status) {if (getConnection() == null)return;Presence presence = new Presence(Presence.Type.available);presence.setStatus(status);getConnection().sendPacket(presence);}/** * 修改用户头像 * * @param file */public boolean changeImage(File file) {if (getConnection() == null)return false;try {VCard vcard = new VCard();vcard.load(getConnection());byte[] bytes;bytes = getFileBytes(file);String encodedImage = StringUtils.encodeBase64(bytes);vcard.setAvatar(bytes, encodedImage);vcard.setEncodedImage(encodedImage);vcard.setField("PHOTO", "<TYPE>image/jpg</TYPE><BINVAL>"+ encodedImage + "</BINVAL>", true);ByteArrayInputStream bais = new ByteArrayInputStream(vcard.getAvatar());FormatTools.getInstance().InputStream2Bitmap(bais);vcard.save(getConnection());return true;} catch (Exception e) {e.printStackTrace();return false;}}/** * 文件转字节 * * @param file * @return * @throws IOException */private byte[] getFileBytes(File file) throws IOException {BufferedInputStream bis = null;try {bis = new BufferedInputStream(new FileInputStream(file));int bytes = (int) file.length();byte[] buffer = new byte[bytes];int readBytes = bis.read(buffer);if (readBytes != buffer.length) {throw new IOException("Entire file not read");}return buffer;} finally {if (bis != null) {bis.close();}}}/** * 删除当前用户 * * @return */public boolean deleteAccount() {if (getConnection() == null)return false;try {getConnection().getAccountManager().deleteAccount();return true;} catch (XMPPException e) {return false;}}/** * 修改密码 * * @return */public boolean changePassword(String pwd) {if (getConnection() == null)return false;try {getConnection().getAccountManager().changePassword(pwd);return true;} catch (XMPPException e) {return false;}}/** * 初始化会议室列表 */public List<HostedRoom> getHostRooms() {if (getConnection() == null)return null;Collection<HostedRoom> hostrooms = null;List<HostedRoom> roominfos = new ArrayList<HostedRoom>();try {new ServiceDiscoveryManager(getConnection());hostrooms = MultiUserChat.getHostedRooms(getConnection(),getConnection().getServiceName());for (HostedRoom entry : hostrooms) {roominfos.add(entry);Log.i("room","名字:" + entry.getName() + " - ID:" + entry.getJid());}Log.i("room", "服务会议数量:" + roominfos.size());} catch (XMPPException e) {e.printStackTrace();}return roominfos;}/** * 创建房间 * * @param roomName * 房间名称 */public MultiUserChat createRoom(String user, String roomName,String password) {if (getConnection() == null)return null;MultiUserChat muc = null;try {// 创建一个MultiUserChatmuc = new MultiUserChat(getConnection(), roomName + "@conference."+ getConnection().getServiceName());// 创建聊天室muc.create(roomName);// 获得聊天室的配置表单Form form = muc.getConfigurationForm();// 根据原始表单创建一个要提交的新表单。Form submitForm = form.createAnswerForm();// 向要提交的表单添加默认答复for (Iterator<FormField> fields = form.getFields(); fields.hasNext();) {FormField field = (FormField) fields.next();if (!FormField.TYPE_HIDDEN.equals(field.getType())&& field.getVariable() != null) {// 设置默认值作为答复submitForm.setDefaultAnswer(field.getVariable());}}// 设置聊天室的新拥有者List<String> owners = new ArrayList<String>();owners.add(getConnection().getUser());// 用户JIDsubmitForm.setAnswer("muc#roomconfig_roomowners", owners);// 设置聊天室是持久聊天室,即将要被保存下来submitForm.setAnswer("muc#roomconfig_persistentroom", true);// 房间仅对成员开放submitForm.setAnswer("muc#roomconfig_membersonly", false);// 允许占有者邀请其他人submitForm.setAnswer("muc#roomconfig_allowinvites", true);if (!password.equals("")) {// 进入是否需要密码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 (XMPPException e) {e.printStackTrace();return null;}return muc;}/** * 加入会议室 * * @param user * 昵称 * @param password * 会议室密码 * @param roomsName * 会议室名 */public MultiUserChat joinMultiUserChat(String user, String roomsName,String password) {if (getConnection() == null)return null;try {// 使用XMPPConnection创建一个MultiUserChat窗口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", "会议室【"+roomsName+"】加入成功........");return muc;} catch (XMPPException e) {e.printStackTrace();Log.i("MultiUserChat", "会议室【"+roomsName+"】加入失败........");return null;}}/** * 查询会议室成员名字 * * @param muc */public List<String> findMulitUser(MultiUserChat muc) {if (getConnection() == null)return null;List<String> listUser = new ArrayList<String>();Iterator<String> it = muc.getOccupants();// 遍历出聊天室人员名称while (it.hasNext()) {// 聊天室成员名字String name = StringUtils.parseResource(it.next());listUser.add(name);}return listUser;}/** * 发送文件 * * @param user * @param filePath */public void sendFile(String user, String filePath) {if (getConnection() == null)return;// 创建文件传输管理器FileTransferManager manager = new FileTransferManager(getConnection());// 创建输出的文件传输OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer(user);// 发送文件try {transfer.sendFile(new File(filePath), "You won't believe this!");} catch (XMPPException e) {e.printStackTrace();}}/** * 获取离线消息 * * @return */public Map<String, List<HashMap<String, String>>> getHisMessage() {if (getConnection() == null)return null;Map<String, List<HashMap<String, String>>> offlineMsgs = null;try {OfflineMessageManager offlineManager = new OfflineMessageManager(getConnection());Iterator<Message> it = offlineManager.getMessages();int count = offlineManager.getMessageCount();if (count <= 0)return null;offlineMsgs = new HashMap<String, List<HashMap<String, String>>>();while (it.hasNext()) {Message message = it.next();String fromUser = StringUtils.parseName(message.getFrom());;HashMap<String, String> histrory = new HashMap<String, String>();histrory.put("useraccount",StringUtils.parseName(getConnection().getUser()));histrory.put("friendaccount", fromUser);histrory.put("info", message.getBody());histrory.put("type", "left");if (offlineMsgs.containsKey(fromUser)) {offlineMsgs.get(fromUser).add(histrory);} else {List<HashMap<String, String>> temp = new ArrayList<HashMap<String, String>>();temp.add(histrory);offlineMsgs.put(fromUser, temp);}}offlineManager.deleteMessages();} catch (Exception e) {e.printStackTrace();}return offlineMsgs;}/** * 判断OpenFire用户的状态 strUrl : * url格式 - http://my.openfire.com:9090/plugins/presence * /status?jid=user1@SERVER_NAME&type=xml * 返回值 : 0 - 用户不存在; 1 - 用户在线; 2 - 用户离线 * 说明 :必须要求 OpenFire加载 presence 插件,同时设置任何人都可以访问 */ public int IsUserOnLine(String user) {String url = "http://"+SERVER_HOST+":9090/plugins/presence/status?" +"jid="+ user +"@"+ SERVER_NAME +"&type=xml";int shOnLineState = 0; // 不存在try {URL oUrl = new URL(url);URLConnection oConn = oUrl.openConnection();if (oConn != null) {BufferedReader oIn = new BufferedReader(new InputStreamReader(oConn.getInputStream()));if (null != oIn) {String strFlag = oIn.readLine();oIn.close();System.out.println("strFlag"+strFlag);if (strFlag.indexOf("type="unavailable"") >= 0) {shOnLineState = 2;}if (strFlag.indexOf("type="error"") >= 0) {shOnLineState = 0;} else if (strFlag.indexOf("priority") >= 0|| strFlag.indexOf("id="") >= 0) {shOnLineState = 1;}}}} catch (Exception e) {e.printStackTrace();}return shOnLineState;}/** * 加入providers的函数 ASmack在/META-INF缺少一个smack.providers 文件 * * @param pm */public void configureConnection(ProviderManager pm) {// Private Data Storagepm.addIQProvider("query", "jabber:iq:private",new PrivateDataManager.PrivateDataIQProvider());// Timetry {pm.addIQProvider("query", "jabber:iq:time",Class.forName("org.jivesoftware.smackx.packet.Time"));} catch (ClassNotFoundException e) {Log.w("TestClient","Can't load class for org.jivesoftware.smackx.packet.Time");}// Roster Exchangepm.addExtensionProvider("x", "jabber:x:roster",new RosterExchangeProvider());// Message Eventspm.addExtensionProvider("x", "jabber:x:event",new MessageEventProvider());// Chat Statepm.addExtensionProvider("active","http://jabber.org/protocol/chatstates",new ChatStateExtension.Provider());pm.addExtensionProvider("composing","http://jabber.org/protocol/chatstates",new ChatStateExtension.Provider());pm.addExtensionProvider("paused","http://jabber.org/protocol/chatstates",new ChatStateExtension.Provider());pm.addExtensionProvider("inactive","http://jabber.org/protocol/chatstates",new ChatStateExtension.Provider());pm.addExtensionProvider("gone","http://jabber.org/protocol/chatstates",new ChatStateExtension.Provider());// XHTMLpm.addExtensionProvider("html", "http://jabber.org/protocol/xhtml-im",new XHTMLExtensionProvider());// Group Chat Invitationspm.addExtensionProvider("x", "jabber:x:conference",new GroupChatInvitation.Provider());// Service Discovery # Itemspm.addIQProvider("query", "http://jabber.org/protocol/disco#items",new DiscoverItemsProvider());// Service Discovery # Infopm.addIQProvider("query", "http://jabber.org/protocol/disco#info",new DiscoverInfoProvider());// Data Formspm.addExtensionProvider("x", "jabber:x:data", new DataFormProvider());// MUC Userpm.addExtensionProvider("x", "http://jabber.org/protocol/muc#user",new MUCUserProvider());// MUC Adminpm.addIQProvider("query", "http://jabber.org/protocol/muc#admin",new MUCAdminProvider());// MUC Ownerpm.addIQProvider("query", "http://jabber.org/protocol/muc#owner",new MUCOwnerProvider());// Delayed Deliverypm.addExtensionProvider("x", "jabber:x:delay",new DelayInformationProvider());// Versiontry {pm.addIQProvider("query", "jabber:iq:version",Class.forName("org.jivesoftware.smackx.packet.Version"));} catch (ClassNotFoundException e) {// Not sure what's happening here.}// VCardpm.addIQProvider("vCard", "vcard-temp", new VCardProvider());// Offline Message Requestspm.addIQProvider("offline", "http://jabber.org/protocol/offline",new OfflineMessageRequest.Provider());// Offline Message Indicatorpm.addExtensionProvider("offline","http://jabber.org/protocol/offline",new OfflineMessageInfo.Provider());// Last Activitypm.addIQProvider("query", "jabber:iq:last", new LastActivity.Provider());// User Searchpm.addIQProvider("query", "jabber:iq:search", new UserSearch.Provider());// SharedGroupsInfopm.addIQProvider("sharedgroup","http://www.jivesoftware.org/protocol/sharedgroup",new SharedGroupsInfo.Provider());// JEP-33: Extended Stanza Addressingpm.addExtensionProvider("addresses","http://jabber.org/protocol/address",new MultipleAddressesProvider());// FileTransferpm.addIQProvider("si", "http://jabber.org/protocol/si",new StreamInitiationProvider());pm.addIQProvider("query", "http://jabber.org/protocol/bytestreams",new BytestreamsProvider());// Privacypm.addIQProvider("query", "jabber:iq:privacy", new PrivacyProvider());pm.addIQProvider("command", "http://jabber.org/protocol/commands",new AdHocCommandDataProvider());pm.addExtensionProvider("malformed-action","http://jabber.org/protocol/commands",new AdHocCommandDataProvider.MalformedActionError());pm.addExtensionProvider("bad-locale","http://jabber.org/protocol/commands",new AdHocCommandDataProvider.BadLocaleError());pm.addExtensionProvider("bad-payload","http://jabber.org/protocol/commands",new AdHocCommandDataProvider.BadPayloadError());pm.addExtensionProvider("bad-sessionid","http://jabber.org/protocol/commands",new AdHocCommandDataProvider.BadSessionIDError());pm.addExtensionProvider("session-expired","http://jabber.org/protocol/commands",new AdHocCommandDataProvider.SessionExpiredError());}}/** * 判断OpenFire用户的状态 strUrl : * url格式 - http://my.openfire.com:9090/plugins/presence * /status?jid=user1@SERVER_NAME&type=xml * 返回值 : 0 - 用户不存在; 1 - 用户在线; 2 - 用户离线 * 说明 :必须要求 OpenFire加载 presence 插件,同时设置任何人都可以访问 */ public int IsUserOnLine(String user) {String url = "http://"+SERVER_HOST+":9090/plugins/presence/status?" +"jid="+ user +"@"+ SERVER_NAME +"&type=xml";int shOnLineState = 0; // 不存在try {URL oUrl = new URL(url);URLConnection oConn = oUrl.openConnection();if (oConn != null) {BufferedReader oIn = new BufferedReader(new InputStreamReader(oConn.getInputStream()));if (null != oIn) {String strFlag = oIn.readLine();oIn.close();System.out.println("strFlag"+strFlag);if (strFlag.indexOf("type="unavailable"") >= 0) {shOnLineState = 2;}if (strFlag.indexOf("type="error"") >= 0) {shOnLineState = 0;} else if (strFlag.indexOf("priority") >= 0|| strFlag.indexOf("id="") >= 0) {shOnLineState = 1;}}}} catch (Exception e) {e.printStackTrace();}return shOnLineState;}
XmppConnection.getInstance().login(username,password)