xmpp的XmppConnection类

来源:互联网 发布:怎么在淘宝上注册店 编辑:程序博客网 时间:2024/06/08 02:43
public class XmppConnection {private static XMPPConnection connection = null;private static XmppConnection xmppConnection;public Roster roster;private static Chat newchat;private static MultiUserChat mulChat;private XmppConnecionListener connectionListener;private XmppMessageInterceptor xmppMessageInterceptor;private XmppMessageListener messageListener;public static List<Room> myRooms = new ArrayList<Room>();public static List<Room> leaveRooms = new ArrayList<Room>();private HashMap<String, MultiUserChat> mucMap = new HashMap<String, MultiUserChat>();protected String TAG = getClass().getSimpleName().toString();private MyPerference mp; ConnectionConfiguration config;/** 打开连接次数统计 */private int openConnCount = 0;// static {// try {// Class.forName("org.jivesoftware.smack.ReconnectionManager");// } catch (Exception e) {// e.printStackTrace();// }// }/** * 单例模式 *  * @return */public static XmppConnection getInstance() {if (xmppConnection == null) {xmppConnection = new XmppConnection();}return xmppConnection;}public void setNull() {connection = null;}// 是否掉线public static boolean unOnlice() {return connection.isConnected();}/** * 创建连接 */public XMPPConnection getConnection() {openConnCount = 0;if (connection == null || !connection.isConnected()) {openConnection();}Log.e("测试yu", connection == null ? "connection is null" : "connection is not null");return connection;}/** * 打开连接 */public boolean openConnection() {try {if (null == connection || !connection.isAuthenticated()) {// isAuthenticated()返回真实,如果当前身份验证成功调用登录方法。XMPPConnection.DEBUG_ENABLED = true;// 开启DEBUG模式// 配置连接mp=new MyPerference(MyApplication.getContext()); config = new ConnectionConfiguration(Constants.SERVER_HOST_POINT,Constants.SERVER_PORT, Constants.SERVER_NAME);// if (Build.VERSION.SDK_INT >= 14) {// config.setKeystoreType("AndroidCAStore"); //$NON-NLS-1$// config.setTruststorePassword(null);// config.setKeystorePath(null);// } else {// config.setKeystoreType("BKS"); //$NON-NLS-1$// String path = System.getProperty("javax.net.ssl.trustStore");// //$NON-NLS-1$// if (path == null)// path = System.getProperty("java.home") + File.separator// //$NON-NLS-1$// + "etc" + File.separator + "security" //$NON-NLS-1$// //$NON-NLS-2$// + File.separator + "cacerts.bks"; //$NON-NLS-1$// config.setKeystorePath(path);// }// config.setSASLAuthenticationEnabled(false);config.setReconnectionAllowed(true);//// 设置如果允许使用重联机制。默认重联是可以的。// Sets the TLS security mode used when making the connection.// By default, the mode is// ConnectionConfiguration.SecurityMode.enabled.             // config.setReconnectionAllowed(true);config.setSecurityMode(SecurityMode.disabled);new Thread(new Runnable() {@Overridepublic void run() {config.setSASLAuthenticationEnabled(false);// 设置客户端是否将使用SASL认证登录到服务器时。如果SASL认证失败,则客户端将尝试使用非SASL认证。默认情况下,启用SASL。}}).start();config.setSendPresence(false); // 状态设为离线,目的为了取离线消息    connection = new XMPPConnection(config);// 自动回复回执方法, ProviderManager pm = ProviderManager.getInstance();pm.addExtensionProvider(DeliveryReceipt.ELEMENT, DeliveryReceipt.NAMESPACE, new DeliveryReceipt.Provider()); pm.addExtensionProvider(DeliveryReceiptRequest.ELEMENT, DeliveryReceipt.NAMESPACE, new DeliveryReceiptRequest.Provider());DeliveryReceiptManager.getInstanceFor(connection).enableAutoReceipts();connection.connect();// 连接到服务器// 配置各种Provider,如果不配置,则会无法解析数据configureConnection(ProviderManager.getInstance());// 添加連接監聽connectionListener = new XmppConnecionListener();connection.addConnectionListener(connectionListener);xmppMessageInterceptor = new XmppMessageInterceptor();connection.addPacketInterceptor(xmppMessageInterceptor, new PacketTypeFilter(Message.class));messageListener = new XmppMessageListener();connection.addPacketListener(messageListener, new PacketTypeFilter(Message.class));////非自动回复回执方法//connection.addPacketListener(new PacketListener() {//public void processPacket(Packet packet) {//// 监听消息,在检查到对方要求回执时,客户端手动发送回执给对方//if (packet instanceof Message) {//Message message = (Message) packet;//PacketExtension receipt = message.getExtension(DeliveryReceiptRequest.ELEMENT,//DeliveryReceipt.NAMESPACE);//if (receipt != null) {//Message receiptMessage = new Message();//receiptMessage.setTo(message.getFrom());//receiptMessage.setFrom(message.getTo());//receiptMessage.setType(Message.Type.chat);  //receiptMessage.addExtension(new DeliveryReceipt(message.getPacketID()));//connection.sendPacket(receiptMessage);//}//}//}//}, new PacketFilter() {//public boolean accept(Packet packet) {//return true;//}//});// connection.addPacketListener(new XmppPresenceListener(),// new PacketTypeFilter(Presence.class));// connection.addPacketListener(arg0, arg1);ProviderManager.getInstance().addIQProvider("muc", "MZH", new MUCPacketExtensionProvider());DeliveryReceiptManager.getInstanceFor(connection).enableAutoReceipts();// new Thread() {// public void run() {// while (true) {// try {// sleep(1000 * 20);// } catch (InterruptedException e) {// e.printStackTrace();// }// if (connection != null) {// PingManager.getInstanceFor(connection)// .pingMyServer();// }// }// };// }.start();/* 调用系统ping */PingManager.getInstanceFor(connection).pingMyServer(1000 * 20);// PingManager.getInstanceFor(connection).setPingIntervall(20);PingManager.getInstanceFor(connection).registerPingFailedListener(new PingFailedListener() {@Overridepublic void pingFailed() {reconnect();}});return true;}} catch (XMPPException xe) {Log.e("测试yu", "open connection is XMPPException");xe.printStackTrace();connection = null;if (openConnCount < 2) {//if(mp.getBoolean("isOutNewWork", false)){//mp.saveBoolean("isOutNewWork", false);//}else {//mp.saveBoolean("isOutNewWork", true);//}openConnCount++;openConnection();}} catch (Exception e) {Log.e("测试yu", "open connection is Exception and type is " + e.getStackTrace()[1].getClassName());e.printStackTrace();if (openConnCount < 2) {openConnCount++;openConnection();}}return false;}/** * 关闭连接 */public void closeConnection(boolean reconnect) {if (connection != null) {// 断开连接的时候移除监听---解决网络不好时出现发送两次的情况(未验证是否已解决)if (messageListener != null) {connection.removePacketListener(messageListener);connection.removePacketInterceptor(xmppMessageInterceptor);}if (connectionListener != null) {connection.removeConnectionListener(connectionListener);}ProviderManager.getInstance().removeIQProvider("muc", "MZH");try {connection.disconnect();} catch (Exception e) {if (Constants.IS_DEBUG)Log.e("asmack dis", e.getMessage());e.printStackTrace();} finally {connection = null;xmppConnection = null;}}if (Constants.IS_DEBUG)Log.e("XmppConnection", "close connection");if (reconnect) {reconnect();}}public void reconnect() {new Thread() {@Overridepublic void run() {try {sleep(5 * 1000);ChatActivity.isLeaving = true;ChatRoomActivity.isLeaving = true;closeConnection(false);if (login(Constants.USER_NAME, Constants.PWD)) {Log.e("测试yu", "登录成功");}} catch (InterruptedException e) {e.printStackTrace();} catch (Exception e) {}super.run();}}.start();}/** * 999999 访问后台 获取 聊天室列表 挨个聊天室加入 *  * @param userid */public void joinChatRoom(String userid) {APIClient.getChatRoom(userid, new AsyncHttpResponseHandler() {@Overrideprotected void onPreExecute() {super.onPreExecute();}@Overridepublic void onFinish() {super.onFinish();}@Overridepublic void onSuccess(int statusCode, String content) {super.onSuccess(statusCode, content);try {if (!"400".equals(new JSONObject(content).getString("status"))) {Gson gson = new Gson();BaseResponse<ChatRoomEntity> response = gson.fromJson(content,new TypeToken<BaseResponse<ChatRoomEntity>>() {}.getType());ArrayList<ChatRoomEntity> data = (ArrayList<ChatRoomEntity>) response.getData();// ChatRoomDbHelper.getInstance(// MyApplication.getInstance()).deleteAllChatRoom(// Constants.USER_NAME);if (data != null && data.size() > 0) {for (ChatRoomEntity chatRoomEntity : data) {if ("2".equals(chatRoomEntity.getJoinState())) {ChatItem chatItem = null;chatItem = MsgDbHelper.getInstance(MyApplication.getInstance()).getChatLastMsg(chatRoomEntity.getRoomId(), ChatItem.GROUP_CHAT);Date date = null;if (chatItem != null) {date = DateUtil.strToDateCN_yyyy_MM_dd_HH_mm_ss_SSS(chatItem.sendDate);} else {date = DateUtil.strToDateCN_yyyy_MM_dd_HH_mm_ss_SSS(ChatRoomDbHelper.getInstance(MyApplication.getInstance()).getChatRoomTime(chatRoomEntity.getRoomId()));}ChatRoomDbHelper.getInstance(MyApplication.getInstance()).checkAndSaveRoom(chatRoomEntity);if (Constants.USER_NAME != null && !"".equals(Constants.USER_NAME)) {XmppConnection.getInstance().joinMultiUserChat(Constants.USER_NAME,chatRoomEntity.getRoomName(), false, date);} else {return;}}}MyApplication.getInstance().sendBroadcast(new Intent("newChatRoom"));}}} catch (JsonSyntaxException e) {e.printStackTrace();} catch (JSONException e) {e.printStackTrace();}}@Overridepublic void onFailure(Throwable error, String content) {Log.i("", content);super.onFailure(error, content);}});}public void loadFriendAndJoinRoom() {new Thread() {public void run() {try {sleep(1 * 1000);ChatActivity.isLeaving = false;ChatRoomActivity.isLeaving = false;} catch (InterruptedException e) {e.printStackTrace();}};}.start();}/** * 登录 *  * @param account *            登录帐号 * @param password *            登录密码 *            onKeydown * @return */public boolean login(String account, String password) throws Exception {try {Log.e("tjj", "开始登录");if (getConnection() == null) {// return false;throw new Exception("Exception");}if (!getConnection().isAuthenticated() && getConnection().isConnected()) {getConnection().login(account, password);// 更改在綫狀態Presence presence = new Presence(Presence.Type.available);// Constants.USER_STATUS = presence.getStatus();// OfflineMessageManager offlineManager = new// OfflineMessageManager(getConnection());// Iterator<org.jivesoftware.smack.packet.Message> it =// offlineManager.getMessages();// while(it.hasNext()){// org.jivesoftware.smack.packet.Message message = it.next();//// Log.e("tjj", "收到离线消息, Received from 【" + message.getFrom() +// "】 message: " + message.getBody());// // NewMsgDbHelper.getInstance(MyApplication.getInstance())// // .saveNewMsg(getUsername(message.getFrom()));// Log.e(TAG,getUsername(message.getFrom()));// //// MsgDbHelper.getInstance(MyApplication.getInstance()).saveChatMsgId(getUsername(message.getFrom()),// DateUtil.dateToStr_yyyy_MM_dd_HH_mm_ss_SSS(new Date()));// messageListener.processPacket(message);// }// //删除离线消息// offlineManager.deleteMessages();// 将状态设置成在线presence.setMode(Presence.Mode.available);getConnection().sendPacket(presence);// roster = XmppConnection.getInstance().getConnection()// .getRoster();// friendListner = new FriendListner();// roster.addRosterListener(friendListner);// 监听邀请加入聊天室请求MultiUserChat.addInvitationListener(getConnection(), new InvitationListener() {@Overridepublic void invitationReceived(Connection conn, String room, String inviter, String reason,String password, Message message) {}});loadFriendAndJoinRoom();String userid = new MyPerference(MyApplication.getInstance()).getString("userid", "");// Log.e("tjj", "========userid========="+userid);if (!"".equals(userid)) {joinChatRoom(userid);}return true;}} catch (XMPPException e) {return false;} catch (IllegalStateException e) {e.fillInStackTrace();return true;}return false;}/** * 收到新邀请后 更改后台数据 *  * @param roomName */protected void updateJoinState(final String roomName) {APIClient.updateJoinState(new MyPerference(MyApplication.getInstance()).getString("userid", ""), roomName,new AsyncHttpResponseHandler() {@Overrideprotected void onPreExecute() {super.onPreExecute();}@Overridepublic void onFinish() {super.onFinish();}@Overridepublic void onSuccess(int statusCode, String content) {JSONObject jsonObject;try {jsonObject = new JSONObject(content);if ("200".equals(jsonObject.getString("status"))) {} else {LogUtil.i("修改聊天室状态", "修改加入聊天室状态失败");}} catch (JSONException e) {e.printStackTrace();}super.onSuccess(statusCode, content);}@Overridepublic void onFailure(Throwable error, String content) {LogUtil.i("修改聊天室状态", "网络异常 ");super.onFailure(error, content);}});}/** * 注册 *  * @param account *            注册帐号 * @param password *            注册密码 * @return 1、注册成功 0、服务器没有返回结果2、这个账号已经存在3、注册失败 */public IQ regist(String account, String password) {if (getConnection() == null)return null;Registration reg = new Registration();reg.setType(IQ.Type.SET);reg.setTo(getConnection().getServiceName());reg.setUsername(account);reg.setPassword(password);// reg.addAttribute("android", "geolo_createUser_android");PacketFilter filter = new AndFilter(new PacketIDFilter(reg.getPacketID()), new PacketTypeFilter(IQ.class));PacketCollector collector = getConnection().createPacketCollector(filter);// 给注册的Packet设置Listener,因为只有等到正真注册成功后,我们才可以交流// collector.addPacketListener(packetListener, filter);// 向服务器端,发送注册Packet包,注意其中Registration是Packet的子类getConnection().sendPacket(reg);IQ result = (IQ) collector.nextResult(SmackConfiguration.getPacketReplyTimeout());// Stop queuing resultscollector.cancel();return result;}/** * 修改密码 *  * @param pwd * @return */public boolean changPwd(String pwd) {try {getConnection().getAccountManager().changePassword(pwd);return true;} catch (XMPPException e) {e.printStackTrace();return false;}}public void setRecevier(String chatName, int chatType) {if (getConnection() == null)return;if (chatType == ChatItem.CHAT) {// 创建回话ChatManager cm = XmppConnection.getInstance().getConnection().getChatManager();// 发送消息给pc服务器的好友(获取自己的服务器,和好友)newchat = cm.createChat(getFullUsername(chatName), null);} else if (chatType == ChatItem.GROUP_CHAT) {mulChat = new MultiUserChat(getConnection(), getFullRoomname(chatName));}}// 发送文本消息@SuppressLint("NewApi")public void sendMsg(String chatName, final String msg, int chatType) throws Exception {if (getConnection() == null) {throw new Exception("XmppException");}//if (!NetWorkUtil.ping()) {//throw new Exception("NoNetException");//}org.jivesoftware.smack.packet.Message message = new org.jivesoftware.smack.packet.Message();if (msg.isEmpty()) {ToastUtil.showShort(MyApplication.getInstance(), "随便写点什么呗");} else {if (chatType == ChatItem.CHAT) {ChatManager cm = XmppConnection.getInstance().getConnection().getChatManager();// 发送消息给pc服务器的好友(获取自己的服务器,和好友)final Chat newchat = cm.createChat(getFullUsername(chatName), null);message.setPacketID(UUID.randomUUID().toString());message.setBody(msg);DeliveryReceiptRequest deliveryReceiptRequest = new DeliveryReceiptRequest();message.addExtension(deliveryReceiptRequest);//DeliveryReceiptManager.addDeliveryReceiptRequest(message);//tjjnewchat.sendMessage(message);} else if (chatType == ChatItem.GROUP_CHAT) {Message newMsg = new Message();newMsg.setPacketID(UUID.randomUUID().toString());newMsg.setBody(msg);newMsg.setType(Message.Type.groupchat);newMsg.setTo(chatName + "@conference." + getConnection().getServiceName());//DeliveryReceiptManager.addDeliveryReceiptRequest(newMsg);//tjjif (mucMap.get(chatName) == null) {if (ChatRoomDbHelper.getInstance(MyApplication.getInstance()).checkChatRoom(chatName)) {ChatItem chatItem = null;chatItem = MsgDbHelper.getInstance(MyApplication.getInstance()).getChatLastMsg(chatName,ChatItem.GROUP_CHAT);Date date = null;if (chatItem != null) {date = DateUtil.strToDateCN_yyyy_MM_dd_HH_mm_ss_SSS(chatItem.sendDate);} else {date = DateUtil.strToDateCN_yyyy_MM_dd_HH_mm_ss_SSS(ChatRoomDbHelper.getInstance(MyApplication.getInstance()).getChatRoomTime(chatName));}joinMultiUserChat(Constants.USER_NAME, chatName, false, date);mucMap.get(chatName).sendMessage(newMsg);// mucMap.get(chatName).sendMessage(msg);} else {handler.sendEmptyMessage(1);}} else {mucMap.get(chatName).sendMessage(newMsg);//389107310970882// mucMap.get(chatName).sendMessage(msg);}}}}// 发送文本消息@SuppressLint("NewApi")public void sendMsg(String msg, int chatType) throws Exception {//if (!NetWorkUtil.ping()) {//throw new Exception("NoNetException");//}if (getConnection() == null) {throw new Exception("XmppException");}org.jivesoftware.smack.packet.Message message = new org.jivesoftware.smack.packet.Message();if (msg.isEmpty()) {ToastUtil.showShort(MyApplication.getInstance(), "随便写点什么呗");} else {message.setBody(msg);message.setPacketID(UUID.randomUUID().toString());DeliveryReceiptManager.addDeliveryReceiptRequest(message);//tjjif (chatType == ChatItem.CHAT) {DeliveryReceiptRequest deliveryReceiptRequest = new DeliveryReceiptRequest();message.addExtension(deliveryReceiptRequest);newchat.sendMessage(message);} else if (chatType == ChatItem.GROUP_CHAT) {mulChat.sendMessage(msg);}}}// 发送消息,附带参数public void sendMsgWithParms(String msg, String[] parms, Object[] datas,int chatType, String roomId) throws Exception {if (getConnection() == null) {throw new Exception("XmppException");}org.jivesoftware.smack.packet.Message message = new org.jivesoftware.smack.packet.Message();for (int i = 0; i < datas.length; i++) {message.setProperty(parms[i], datas[i]);//Log.e("tjj", "==========parms============="+parms[i]+"           "+datas[i]);}message.setPacketID(UUID.randomUUID().toString());message.setBody(msg);if (chatType == ChatItem.CHAT) {DeliveryReceiptManager.addDeliveryReceiptRequest(message);newchat.sendMessage(message);} else if (chatType == ChatItem.GROUP_CHAT) {// DeliveryReceiptManager.addDeliveryReceiptRequest(message);//mucMap.get(roomId).sendMessage(msg + ":::" + datas[0]);//389107310970882       389107310970882if (mucMap.get(roomId) == null) {if (ChatRoomDbHelper.getInstance(MyApplication.getInstance()).checkChatRoom(roomId)) {ChatItem chatItem = null;chatItem = MsgDbHelper.getInstance(MyApplication.getInstance()).getChatLastMsg(roomId,ChatItem.GROUP_CHAT);Date date = null;if (chatItem != null) {date = DateUtil.strToDateCN_yyyy_MM_dd_HH_mm_ss_SSS(chatItem.sendDate);} else {date = DateUtil.strToDateCN_yyyy_MM_dd_HH_mm_ss_SSS(ChatRoomDbHelper.getInstance(MyApplication.getInstance()).getChatRoomTime(roomId));}joinMultiUserChat(Constants.USER_NAME, roomId, false, date);mucMap.get(roomId).sendMessage(msg + ":::" + datas[0]);// mucMap.get(chatName).sendMessage(msg);} else {handler.sendEmptyMessage(1);}} else {mucMap.get(roomId).sendMessage(msg + ":::" + datas[0]);// mucMap.get(chatName).sendMessage(msg);}}}// 发送消息,附带参数,转发public void sendMsgWithParms(String chatName, String msg, String[] parms, Object[] datas, int chatType,String roomId) throws Exception {if (getConnection() == null) {throw new Exception("XmppException");}org.jivesoftware.smack.packet.Message message = new org.jivesoftware.smack.packet.Message();for (int i = 0; i < datas.length; i++) {message.setProperty(parms[i], datas[i]);}ChatManager cm = XmppConnection.getInstance().getConnection().getChatManager();// 发送消息给pc服务器的好友(获取自己的服务器,和好友)final Chat newchat = cm.createChat(getFullUsername(chatName), null);message.setPacketID(UUID.randomUUID().toString());message.setBody(msg);if (chatType == ChatItem.CHAT) {DeliveryReceiptManager.addDeliveryReceiptRequest(message);newchat.sendMessage(message);} else if (chatType == ChatItem.GROUP_CHAT) { DeliveryReceiptManager.addDeliveryReceiptRequest(message);//tjjmucMap.get(roomId).sendMessage(msg + ":::" + datas[0]);}}// 发送邀请消息invitatiepublic void sendInvitateMsgWithParms(String msg, String[] parms, Object[] datas, int chatType, String roomId)throws Exception {if (getConnection() == null) {throw new Exception("XmppException");}org.jivesoftware.smack.packet.Message message = new org.jivesoftware.smack.packet.Message();for (int i = 0; i < datas.length; i++) {message.setProperty(parms[i], datas[i]);}message.setPacketID(UUID.randomUUID().toString());message.setBody(msg);/* * message.setType(Type.groupchat); * message.setTo(getFullRoomname(roomId)); * mucMap.get(roomId).sendMessage(message); */message.setType(Type.chat);message.setTo(getFullUsername((String) datas[0]));//tjjDeliveryReceiptManager.addDeliveryReceiptRequest(message);newchat.sendMessage(message);}// 发送群组邀请消息invitatiepublic void sendInvitateGroupMsgWithParms(String msg, String[] parms, Object[] datas, int chatType, String roomId)throws Exception {if (getConnection() == null) {throw new Exception("XmppException");}org.jivesoftware.smack.packet.Message message = new org.jivesoftware.smack.packet.Message();for (int i = 0; i < datas.length; i++) {message.setProperty(parms[i], datas[i]);}message.setPacketID(UUID.randomUUID().toString());message.setBody(msg);message.setType(Type.groupchat);message.setTo(getFullRoomname(roomId));//tjjDeliveryReceiptManager.addDeliveryReceiptRequest(message);mucMap.get(roomId).sendMessage(message);}// 发送@消息public void sendATMsg(String msg, String[] parms, Object[] datas, int chatType, String roomId) throws Exception {if (getConnection() == null) {throw new Exception("XmppException");}org.jivesoftware.smack.packet.Message message = new org.jivesoftware.smack.packet.Message();for (int i = 0; i < datas.length; i++) {message.setProperty(parms[i], datas[i]);}message.setPacketID(UUID.randomUUID().toString());message.setBody(msg);message.setType(Type.groupchat);message.setTo(getFullRoomname(roomId));//tjjDeliveryReceiptManager.addDeliveryReceiptRequest(message);mucMap.get(roomId).sendMessage(message);}// 发送消息,附带参数public void sendGroupWithParms(String msg, String[] parms, Object[] datas, int chatType, String roomId)throws Exception {if (getConnection() == null) {throw new Exception("XmppException");}org.jivesoftware.smack.packet.Message message = new org.jivesoftware.smack.packet.Message();for (int i = 0; i < datas.length; i++) {message.setProperty(parms[i], datas[i]);}message.setPacketID(UUID.randomUUID().toString());message.setBody(msg);DeliveryReceiptManager.addDeliveryReceiptRequest(message);if (chatType == ChatItem.GROUP_CHAT) {mucMap.get(roomId).sendMessage(message);// mucMap.get(roomId).sendMessage(msg);}}/** * 搜索好友 *  * @param key * @return */public List<String> searchUser(String key) {List<String> userList = new ArrayList<String>();try {UserSearchManager search = new UserSearchManager(getConnection());Form searchForm = search.getSearchForm("search." + Constants.SERVER_NAME);Form answerForm = searchForm.createAnswerForm();answerForm.setAnswer("Username", true);answerForm.setAnswer("search", key);ReportedData data = search.getSearchResults(answerForm, "search." + Constants.SERVER_NAME);Iterator<Row> it = data.getRows();Row row = null;while (it.hasNext()) {row = it.next();userList.add(row.getValues("Username").next().toString());}} catch (Exception e) {e.printStackTrace();}return userList;}/** * 添加好友 无分组 *  * @param userName *            id * @param name *            昵称 * @return */public boolean addUser(String userName) {if (getConnection() == null)return false;try {getConnection().getRoster().createEntry(getFullUsername(userName), getFullUsername(userName), null);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 file */public boolean changeVcard(VCard vcard) {if (getConnection() == null)return false;try {// 加入这句代码,解决No VCard forProviderManager.getInstance().addIQProvider("vCard", "vcard-temp", new VCardProvider());vcard.save(getConnection());} catch (Exception e) {e.printStackTrace();return false;}return true;}/** * 修改用户头像 *  * @param file */public Bitmap changeImage(File file) {Bitmap bitmap = null;if (getConnection() == null)return bitmap;try {VCard vcard = Constants.loginUser.vCard;// 加入这句代码,解决No VCard forProviderManager.getInstance().addIQProvider("vCard", "vcard-temp", new VCardProvider());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);vcard.setField("avatar", encodedImage);ByteArrayInputStream bais = new ByteArrayInputStream(bytes);bitmap = FormatTools.getInstance().InputStream2Bitmap(bais);// Image image = ImageIO.read(bais);// ImageIcon ic = new ImageIcon(image);vcard.save(getConnection());} catch (Exception e) {e.printStackTrace();}return bitmap;}/** * 获取用户信息 *  * @param user * @return */public VCard getUserInfo(String user) { // null 时查自己try {VCard vcard = new VCard();// 加入这句代码,解决No VCard forProviderManager.getInstance().addIQProvider("vCard", "vcard-temp", new VCardProvider());if (user == null) {vcard.load(getConnection());} else {vcard.load(getConnection(), user + "@" + Constants.SERVER_NAME);}if (vcard != null)return vcard;} catch (Exception e) {e.printStackTrace();}return null;}/** * 获取用户头像信息 *  * @param connection * @param user * @return */public Bitmap getUserImage(String user) { // null 时查自己ByteArrayInputStream bais = null;try {VCard vcard = new VCard();// 加入这句代码,解决No VCard forProviderManager.getInstance().addIQProvider("vCard", "vcard-temp", new VCardProvider());if (user == null) {vcard.load(getConnection());} else {vcard.load(getConnection(), user + "@" + Constants.SERVER_NAME);}if (vcard == null || vcard.getAvatar() == null)return null;bais = new ByteArrayInputStream(vcard.getAvatar());} catch (Exception e) {e.printStackTrace();}if (bais == null)return null;return FormatTools.getInstance().InputStream2Bitmap(bais);}/** * 文件转字节 *  * @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();}}}/** * 创建房间 *  * @param roomName *            房间名称 */public MultiUserChat createRoom(String roomName) {// String user,if (getConnection() == null)return null;try {// 创建一个MultiUserChatmulChat = new MultiUserChat(getConnection(), roomName + "@conference." + getConnection().getServiceName());// 创建聊天室mulChat.create(roomName);// 获得聊天室的配置表单Form form = mulChat.getConfigurationForm();// 根据原始表单创建一个要提交的新表单。Form submitForm = form.createAnswerForm();// 向要提交的表单添加默认答复for (Iterator 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());// 用户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);// if (!password.equals("")) {// // 进入是否需要密码// submitForm.setAnswer("muc#roomconfig_passwordprotectedroom",false);// // 设置进入密码// submitForm.setAnswer("muc#roomconfig_roomsecret", password);// }// 能够发现占有者真实 JID 的角色// submitForm.setAnswer("muc#roomconfig_whois", "anyone");// 设置描述submitForm.setAnswer("muc#roomconfig_roomdesc", "mulchat");// 登录房间对话submitForm.setAnswer("muc#roomconfig_enablelogging", true);// 仅允许注册的昵称登录submitForm.setAnswer("x-muc#roomconfig_reservednick", false);// 允许使用者修改昵称submitForm.setAnswer("x-muc#roomconfig_canchangenick", true);// 允许用户注册房间submitForm.setAnswer("x-muc#roomconfig_registration", true);// 最大人数List<String> list_single = new ArrayList<String>();list_single.add("0");submitForm.setAnswer("muc#roomconfig_maxusers", list_single);// 发送已完成的表单(有默认值)到服务器来配置聊天室mulChat.sendConfigurationForm(submitForm);// muc.addMessageListener(new TaxiMultiListener());mucMap.put(roomName, mulChat);} catch (XMPPException e) {// ToastUtil.show(MyApplication.getInstance(), "网络不给力,请重试");Log.e("you wenti", "网络不给力,请重试" + e.getMessage());e.printStackTrace();return null;}return mulChat;}/** * 加入会议室 *  * @param user *            昵称 * @param restart *            是否需要重启,asmack的错误。新邀请的时候为true * @param roomsName *            会议室名 */public MultiUserChat joinMultiUserChat(String user, String roomsName, boolean restart, Date date) {if (getConnection() == null)return null;try {// 使用XMPPConnection创建一个MultiUserChat窗口MultiUserChat muc = new MultiUserChat(getConnection(),roomsName + "@conference." + getConnection().getServiceName());// 聊天室服务将会决定要接受的历史记录数量DiscussionHistory history = new DiscussionHistory();history.setMaxStanzas(99);// history.setSeconds(999999);history.setSeconds(86400);if (date == null) {} else {date = new Date(date.getTime());// 获取到后三秒的消息 这个三秒是测出来的数据// SimpleDateFormat dateFormat = new SimpleDateFormat(// "yyyy-MM-dd HH:mm:ss SSS");// Date date2 = dateFormat.parse("1971-12-21 07:32:34 444");history.setSince(date);}if (roomsName.contains("307133148121090")) {System.out.println("==");}// 用户加入聊天室try {muc.join(user, null, history, SmackConfiguration.getPacketReplyTimeout());} catch (Exception e) {if (Constants.IS_DEBUG) {// ToastUtil.show(MyApplication.getInstance(), "加入聊天室("// + roomsName + ")失败" + e.toString());android.os.Message msg = handler.obtainMessage();msg.what = 0;msg.obj = e.getMessage();handler.sendMessage(msg);}}muc.addParticipantStatusListener(new ParticipantStatusListener() {@Overridepublic void voiceRevoked(String participant) {Log.i(TAG, "禁止" + participant + "发言");}@Overridepublic void voiceGranted(String participant) {Log.i(TAG, "给" + participant + "授权发言");}@Overridepublic void ownershipRevoked(String participant) {Log.i(TAG, "移除所有者权限" + participant);}@Overridepublic void ownershipGranted(String participant) {Log.i(TAG, "授予所有者权限" + participant);}@Overridepublic void nicknameChanged(String participant, String newNickname) {Log.i(TAG, "昵称改变了" + participant);}@Overridepublic void moderatorRevoked(String participant) {Log.i(TAG, "移除主持人权限" + participant);}@Overridepublic void moderatorGranted(String participant) {Log.i(TAG, "授予主持人权限" + participant);}@Overridepublic void membershipRevoked(String participant) {Log.i(TAG, "成员权限被移除" + participant);}@Overridepublic void membershipGranted(String participant) {Log.i(TAG, "授予成员权限" + participant);}@Overridepublic void left(String participant) {// String lefter = participant.substring(participant// .indexOf("/") + 1);// Log.i(TAG, "执行了left方法:" + lefter + "离开的房间");// String roomId = getRoomName(participant.substring(0,// participant.indexOf("/")));// // 更新成员// getChatRoomMssage(lefter, roomId);}@Overridepublic void kicked(String participant, String actor, String reason) {Log.i(TAG, "踢人" + participant + "被踢出房间");}@Overridepublic void joined(String participant) {Log.i(TAG, "执行了joined方法:" + participant + "加入了房间");// 更新成员}@Overridepublic void banned(String participant, String actor, String reason) {Log.i(TAG, "禁止加入房间(拉黑,不知道怎么理解,呵呵)" + participant);}@Overridepublic void adminRevoked(String participant) {Log.i(TAG, "移除管理员权限" + participant);}@Overridepublic void adminGranted(String participant) {Log.i(TAG, "授予管理员权限" + participant);}});mucMap.put(roomsName, muc);if (Constants.IS_DEBUG)Log.e("muc", "会议室【" + roomsName + "】加入成功........");return muc;} catch (Exception e) {e.printStackTrace();if (Constants.IS_DEBUG)Log.e("muc", "会议室【" + roomsName + "】加入失败........");return null;} finally {if (restart) {reconnect();}}}private Handler handler = new Handler(MyApplication.getInstance().getMainLooper()) {@Overridepublic void handleMessage(android.os.Message msg) {super.handleMessage(msg);if (msg.what == 0) {if (!"item-not-found(404)".equals((String) msg.obj)) {// ToastUtil.show(MyApplication.getInstance(), "加载聊天室失败");}} else if (msg.what == 1) {ToastUtil.showShort(MyApplication.getInstance(), "您尚未加入该聊天室");// luzhaoshengMyApplication.getInstance().sendBroadcast(new Intent("hasLeaveChatRoom"));// \\}}};/** * 离开聊天室 *  * @param roomName */public void leaveMuc(String roomName) {// 使用XMPPConnection创建一个MultiUserChat窗口MultiUserChat muc = mucMap.get(roomName);muc.leave();mucMap.remove(roomName);if (Constants.IS_DEBUG)Log.e("muc", "会议室【" + roomName + "】退出成功........");}/** * 通过jid获得username *  * @param fullUsername * @return */public static String getUsername(String fullUsername) {return fullUsername.split("@")[0];}/** * 通过username获得jid *  * @param username * @return */public static String getFullUsername(String username) {return username + "@" + Constants.SERVER_NAME;}/** * 通过roomjid获取房间名 *  * @param fullRoomname * @return */public static String getRoomName(String fullRoomname) {return fullRoomname.split("@")[0];}/** * 通过roomjid获取发送者 *  * @param fullRoomname * @return */public static String getRoomUserName(String fullRoomname) {return fullRoomname.split("/")[1];}/** * 通过roomName获得roomjid *  * @param roomName * @return */public static String getFullRoomname(String roomName) {return roomName + "@conference." + Constants.SERVER_NAME;}/** * 加入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");}// pm.addExtensionProvider("received", Carbon.NAMESPACE,// new Carbon.Provider());// add delivery receiptspm.addExtensionProvider(DeliveryReceipt.ELEMENT, DeliveryReceipt.NAMESPACE, new DeliveryReceipt.Provider());pm.addExtensionProvider(DeliveryReceiptRequest.ELEMENT, DeliveryReceipt.NAMESPACE,new DeliveryReceiptRequest.Provider());// new DeliveryReceiptRequest().getNamespace()// add XMPP Ping (XEP-0199)5// pm.addIQProvider("ping", "urn:xmpp:ping", new PingProvider());// Message Eventspm.addExtensionProvider("x", "jabber:x:roster", new RosterExchangeProvider());pm.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());pm.addExtensionProvider("delay", "urn:xmpp:delay", new DelayInfoProvider());pm.addExtensionProvider("x", "jabber:x:delay", new DelayInfoProvider());// 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());}/** * 直接通过 HttpMime's MultipartEntity 提交数据到服务器,实现表单提交功能。 *  * @return 请求所返回的内容 */public static String requestService(String url, Map<String, String> param) {if (Constants.IS_DEBUG)Log.e("url", url);String result = "";try {DefaultHttpClient client = getNewHttpClient();HttpPost request = new HttpPost(url);List<NameValuePair> paramList = new ArrayList<NameValuePair>();// if (Constants.USER_NAME!="" && !param.containsKey("userName")) {// param.put("userName", Constants.USER_NAME);// }for (Map.Entry<String, String> entry : param.entrySet()) {paramList.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));if (Constants.IS_DEBUG)Log.e("json parm", entry.getKey() + ":" + entry.getValue());}HttpEntity entity1 = new UrlEncodedFormEntity(paramList, "UTF-8");request.setEntity(entity1);HttpResponse response = client.execute(request);int stateCode = response.getStatusLine().getStatusCode();if (stateCode == 201 || stateCode == 200) {HttpEntity entity = response.getEntity();result = EntityUtils.toString(entity, HTTP.UTF_8);if (Constants.IS_DEBUG)Log.e("json", result);} else {result = "";}request.abort();} catch (Exception e) {e.printStackTrace();if (Constants.IS_DEBUG)Log.e("json", e.toString());} finally {// 释放资源new DefaultHttpClient().getConnectionManager().shutdown();}return result;}private static DefaultHttpClient getNewHttpClient() {BasicHttpParams timeoutParams = new BasicHttpParams();try {KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());trustStore.load(null, null);// SSLSocketFactory sf = new SSLSocketFactoryEx(trustStore);// sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);// 设置连接超时时间(单位毫秒)HttpConnectionParams.setConnectionTimeout(timeoutParams, 30000);HttpConnectionParams.setSoTimeout(timeoutParams, 150000);HttpProtocolParams.setVersion(timeoutParams, HttpVersion.HTTP_1_1);HttpProtocolParams.setContentCharset(timeoutParams, HTTP.UTF_8);SchemeRegistry registry = new SchemeRegistry();registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));// registry.register(new Scheme("https", sf, 443));ClientConnectionManager ccm = new ThreadSafeClientConnManager(timeoutParams, registry);return new DefaultHttpClient(ccm, timeoutParams);} catch (Exception e) {return new DefaultHttpClient(timeoutParams);}}// private boolean isFirst = true;class MUCPacketExtensionProvider implements IQProvider {@Overridepublic IQ parseIQ(XmlPullParser parser) throws Exception {int eventType = parser.getEventType();myRooms.clear();leaveRooms.clear();// if (!isFirst) {// XmppConnection.getInstance().closeConnection();// }// isFirst = false;Room info = null;while (true) {if (eventType == XmlPullParser.START_TAG) {if ("room".equals(parser.getName())) {String account = parser.getAttributeValue("", "account");String roomName = parser.getAttributeValue("", "roomName");String roomJid = parser.getAttributeValue("", "roomJid");info = new Room();info.name = roomName;info.roomid = roomJid;myRooms.add(info);}if ("friend".equals(parser.getName())) {info.friendList.add(XmppConnection.getUsername(parser.nextText()));}} else if (eventType == XmlPullParser.END_TAG) {if ("muc".equals(parser.getName())) {break;}}eventType = parser.next();}return null;}}/** * 初始化聊服务会议列表 */private ArrayList<HostedRoom> initHostRoom() {ArrayList<HostedRoom> roominfos = new ArrayList<HostedRoom>();Collection<HostedRoom> hostrooms;try {hostrooms = MultiUserChat.getHostedRooms(getConnection(), Constants.SERVER_NAME);for (HostedRoom entry : hostrooms) {roominfos.add(entry);// Log.i("aaa",// "名字:" + entry.getName() + " - ID:" + entry.getJid());}// Log.i("aaa", "服务会议数量:" + roominfos.size());} catch (XMPPException e) {e.printStackTrace();}if (roominfos.size() > 0) {return roominfos;}return null;}/** * 获取聊天室的所有成员 *  * @return */public List<Friend> getChatRoomMember(String roomName) {final List<Friend> roomnumber = new ArrayList<Friend>();MultiUserChat muc = new MultiUserChat(connection, getFullRoomname(roomName));Iterator<String> it = muc.getOccupants();while (it.hasNext()) {String name = it.next();name = name.substring(name.indexOf("/") + 1);roomnumber.add(new Friend(name));Log.i("aaa", "成员名字;" + name);}return roomnumber;}/** * 获取已经加入的聊天室 */public void getJoinedRoom() {System.out.println("--------------------------------------");Iterator<?> joinedRooms = MultiUserChat.getJoinedRooms(getConnection(), initHostRoom().get(2).getJid());while (joinedRooms.hasNext()) {System.out.println(joinedRooms);joinedRooms.next();}System.out.println("--------------------------------------");}/** * 获取管理员列表 */public void getAdmins() {try {Collection<Affiliate> affiliates = mulChat.getAdmins();Iterator<Affiliate> iterator = affiliates.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}} catch (XMPPException e) {e.printStackTrace();}}/** * 邀请进入群聊 *  * @param ofUserid * @param string */public void invite(String roomId, String ofUserid, String reason) {MultiUserChat multiUserChat = mucMap.get(roomId);multiUserChat.invite(getFullUsername(ofUserid), DateUtil.now_yyyy_MM_dd_HH_mm_ss_SSS());}/** * 移除聊天室人员 *  * @param string */public void removeChatRoomMember(String ofuserid, String roomId) {// MultiUserChat multiUserChat = mucMap.get(roomId);// try {try {sendMsgWithParms("KickParticipant", new String[] { "KickParticipant" }, new Object[] { ofuserid }, 1,roomId);org.jivesoftware.smack.packet.Message message = new org.jivesoftware.smack.packet.Message();message.setProperty("KickParticipant", ofuserid);message.setProperty("roomid", roomId);message.setBody("KickParticipant");ChatManager cm = XmppConnection.getInstance().getConnection().getChatManager();// 发送消息给pc服务器的好友(获取自己的服务器,和好友)Chat removeChat = cm.createChat(getFullUsername(ofuserid), null);removeChat.sendMessage(message);} catch (Exception e) {e.printStackTrace();}// multiUserChat.kickParticipant(getFullUsername(ofuserid), "踢了");// } catch (XMPPException e) {// e.printStackTrace();// }}}

原创粉丝点击