PageRenderTime 5239ms CodeModel.GetById 50ms RepoModel.GetById 9ms app.codeStats 1ms

/src/com/example/smackdemo/util/XmppTool.java

https://github.com/liyi0930/Asmack-Demo
Java | 984 lines | 671 code | 106 blank | 207 comment | 33 complexity | 160abdb619cf5a1684197f6545368706 MD5 | raw file
  1. package com.example.smackdemo.util;
  2. import java.io.File;
  3. import java.security.MessageDigest;
  4. import java.util.ArrayList;
  5. import java.util.Collection;
  6. import java.util.Date;
  7. import java.util.Iterator;
  8. import java.util.List;
  9. import org.jivesoftware.smack.Chat;
  10. import org.jivesoftware.smack.ConnectionConfiguration;
  11. import org.jivesoftware.smack.ConnectionListener;
  12. import org.jivesoftware.smack.MessageListener;
  13. import org.jivesoftware.smack.PacketCollector;
  14. import org.jivesoftware.smack.Roster;
  15. import org.jivesoftware.smack.RosterEntry;
  16. import org.jivesoftware.smack.RosterGroup;
  17. import org.jivesoftware.smack.SmackConfiguration;
  18. import org.jivesoftware.smack.XMPPConnection;
  19. import org.jivesoftware.smack.XMPPException;
  20. import org.jivesoftware.smack.filter.AndFilter;
  21. import org.jivesoftware.smack.filter.PacketFilter;
  22. import org.jivesoftware.smack.filter.PacketIDFilter;
  23. import org.jivesoftware.smack.packet.IQ;
  24. import org.jivesoftware.smack.packet.Message;
  25. import org.jivesoftware.smack.packet.Packet;
  26. import org.jivesoftware.smack.packet.Presence;
  27. import org.jivesoftware.smack.packet.Registration;
  28. import org.jivesoftware.smack.provider.PrivacyProvider;
  29. import org.jivesoftware.smack.provider.ProviderManager;
  30. import org.jivesoftware.smack.util.StringUtils;
  31. import org.jivesoftware.smackx.Form;
  32. import org.jivesoftware.smackx.FormField;
  33. import org.jivesoftware.smackx.GroupChatInvitation;
  34. import org.jivesoftware.smackx.OfflineMessageManager;
  35. import org.jivesoftware.smackx.PrivateDataManager;
  36. import org.jivesoftware.smackx.ReportedData;
  37. import org.jivesoftware.smackx.ReportedData.Row;
  38. import org.jivesoftware.smackx.bookmark.BookmarkManager;
  39. import org.jivesoftware.smackx.bookmark.BookmarkedConference;
  40. import org.jivesoftware.smackx.bytestreams.ibb.provider.CloseIQProvider;
  41. import org.jivesoftware.smackx.bytestreams.ibb.provider.DataPacketProvider;
  42. import org.jivesoftware.smackx.bytestreams.ibb.provider.OpenIQProvider;
  43. import org.jivesoftware.smackx.bytestreams.socks5.provider.BytestreamsProvider;
  44. import org.jivesoftware.smackx.filetransfer.FileTransfer.Status;
  45. import org.jivesoftware.smackx.filetransfer.FileTransferListener;
  46. import org.jivesoftware.smackx.filetransfer.FileTransferManager;
  47. import org.jivesoftware.smackx.filetransfer.FileTransferRequest;
  48. import org.jivesoftware.smackx.filetransfer.IncomingFileTransfer;
  49. import org.jivesoftware.smackx.filetransfer.OutgoingFileTransfer;
  50. import org.jivesoftware.smackx.muc.DiscussionHistory;
  51. import org.jivesoftware.smackx.muc.HostedRoom;
  52. import org.jivesoftware.smackx.muc.MultiUserChat;
  53. import org.jivesoftware.smackx.muc.RoomInfo;
  54. import org.jivesoftware.smackx.packet.ChatStateExtension;
  55. import org.jivesoftware.smackx.packet.LastActivity;
  56. import org.jivesoftware.smackx.packet.OfflineMessageInfo;
  57. import org.jivesoftware.smackx.packet.OfflineMessageRequest;
  58. import org.jivesoftware.smackx.packet.SharedGroupsInfo;
  59. import org.jivesoftware.smackx.packet.VCard;
  60. import org.jivesoftware.smackx.provider.AdHocCommandDataProvider;
  61. import org.jivesoftware.smackx.provider.DataFormProvider;
  62. import org.jivesoftware.smackx.provider.DelayInformationProvider;
  63. import org.jivesoftware.smackx.provider.DiscoverInfoProvider;
  64. import org.jivesoftware.smackx.provider.DiscoverItemsProvider;
  65. import org.jivesoftware.smackx.provider.MUCAdminProvider;
  66. import org.jivesoftware.smackx.provider.MUCOwnerProvider;
  67. import org.jivesoftware.smackx.provider.MUCUserProvider;
  68. import org.jivesoftware.smackx.provider.MessageEventProvider;
  69. import org.jivesoftware.smackx.provider.MultipleAddressesProvider;
  70. import org.jivesoftware.smackx.provider.RosterExchangeProvider;
  71. import org.jivesoftware.smackx.provider.StreamInitiationProvider;
  72. import org.jivesoftware.smackx.provider.VCardProvider;
  73. import org.jivesoftware.smackx.provider.XHTMLExtensionProvider;
  74. import org.jivesoftware.smackx.search.UserSearch;
  75. import org.jivesoftware.smackx.search.UserSearchManager;
  76. import android.os.Environment;
  77. import android.util.Log;
  78. import com.example.smackdemo.SApp;
  79. import com.example.smackdemo.model.MucRoom;
  80. import com.example.smackdemo.model.User;
  81. /***
  82. * api
  83. *
  84. * @author tracyZhang
  85. *
  86. */
  87. public class XmppTool {
  88. private String tag = "XmppTool";
  89. public static final String HOST = "192.168.1.102";
  90. public static final String DOMAIN = "@zhanglei";
  91. // public static final String HOST = "192.168.0.36";
  92. // public static final String DOMAIN = "@bxq-PC";
  93. public static final int PORT = 5222;
  94. public static final String CONFERENCE = "@conference.";
  95. private static XmppTool instance;
  96. private XMPPConnection con;
  97. private MultiUserChat muc;
  98. public MultiUserChat getMuc() {
  99. return muc;
  100. }
  101. public void setMuc(MultiUserChat muc) {
  102. this.muc = muc;
  103. }
  104. {
  105. try {
  106. Class.forName("org.jivesoftware.smack.ReconnectionManager");
  107. } catch (Exception e) {
  108. e.printStackTrace();
  109. }
  110. }
  111. private XmppTool(){
  112. configure(ProviderManager.getInstance());
  113. ConnectionConfiguration connConfig = new ConnectionConfiguration(
  114. HOST, PORT);
  115. connConfig.setSASLAuthenticationEnabled(false);
  116. connConfig.setReconnectionAllowed(true);
  117. // connConfig.setSecurityMode(ConnectionConfiguration.SecurityMode.enabled);
  118. connConfig.setSendPresence(false);
  119. con = new XMPPConnection(connConfig);
  120. con.DEBUG_ENABLED = true;
  121. Roster.setDefaultSubscriptionMode(Roster.SubscriptionMode.manual);
  122. try {
  123. con.connect();
  124. con.addConnectionListener(new ConnectionListener() {
  125. @Override
  126. public void reconnectionSuccessful() {
  127. // TODO Auto-generated method stub
  128. SLog.i(tag, "重连成功");
  129. }
  130. @Override
  131. public void reconnectionFailed(Exception arg0) {
  132. // TODO Auto-generated method stub
  133. SLog.i(tag, "重连失败");
  134. }
  135. @Override
  136. public void reconnectingIn(int arg0) {
  137. // TODO Auto-generated method stub
  138. SLog.i(tag, "重连中");
  139. }
  140. @Override
  141. public void connectionClosedOnError(Exception e) {
  142. // TODO Auto-generated method stub
  143. SLog.i(tag, "连接出错");
  144. if(e.getMessage().contains("conflict")){
  145. SLog.i(tag, "被挤掉了");
  146. disConnectServer();
  147. }
  148. }
  149. @Override
  150. public void connectionClosed() {
  151. // TODO Auto-generated method stub
  152. SLog.i(tag, "连接关闭");
  153. }
  154. });
  155. } catch (XMPPException e) {
  156. SLog.e(tag, Log.getStackTraceString(e));
  157. }
  158. }
  159. public XMPPConnection getCon() {
  160. return con;
  161. }
  162. public static XmppTool getInstance(){
  163. if(null == instance)
  164. instance = new XmppTool();
  165. return instance;
  166. }
  167. public boolean connServer(){
  168. if(con.isConnected())
  169. return true;
  170. try {
  171. con.connect();
  172. return true;
  173. } catch (XMPPException e) {
  174. SLog.e(tag, Log.getStackTraceString(e));
  175. }
  176. return false;
  177. }
  178. public void disConnectServer(){
  179. if(null!=con && con.isConnected())
  180. con.disconnect();
  181. }
  182. /**
  183. * 注册
  184. * @param name
  185. * @param pwd
  186. * @return 0 服务端无响应 1成功 2已存在 3 失败
  187. */
  188. public int regist(String name , String pwd){
  189. Registration reg = new Registration();
  190. reg.setType(IQ.Type.SET);
  191. reg.setTo(con.getServiceName());
  192. reg.setUsername(name);
  193. reg.setPassword(pwd);
  194. reg.addAttribute("Android", "createUser");
  195. PacketFilter filter = new AndFilter(new PacketIDFilter(reg.getPacketID()));
  196. PacketCollector col = con.createPacketCollector(filter);
  197. con.sendPacket(reg);
  198. IQ result = (IQ) col.nextResult(SmackConfiguration.getPacketReplyTimeout());
  199. col.cancel();
  200. if(null==result){
  201. SLog.e(tag, "no response from server");
  202. return 0;
  203. }else if(result.getType() == IQ.Type.RESULT){
  204. SLog.e(tag, result.toString());
  205. return 1;
  206. }else if(result.getType() == IQ.Type.ERROR){
  207. SLog.e(tag, result.toString());
  208. if(result.getError().toString().equalsIgnoreCase("conflict(409)")){
  209. return 2;
  210. }else{
  211. return 3;
  212. }
  213. }
  214. return 3;
  215. }
  216. /**
  217. * 登录 取离线消息,在设置为在线
  218. * @param name
  219. * @param pwd
  220. * @return
  221. */
  222. public boolean login(String name,String pwd){
  223. try {
  224. // SASLAuthentication.supportSASLMechanism("PLAIN", 0);
  225. con.login(name, pwd);
  226. getOffLineMessages();
  227. setPresence(0);
  228. setPresence(4);
  229. return true;
  230. } catch (XMPPException e) {
  231. SLog.e(tag, Log.getStackTraceString(e));
  232. }
  233. return false;
  234. }
  235. /**
  236. * 修改密码
  237. * @param pwd
  238. * @return
  239. */
  240. public boolean changePwd(String pwd){
  241. try {
  242. con.getAccountManager().changePassword(pwd);
  243. return true;
  244. } catch (XMPPException e) {
  245. SLog.e(tag, Log.getStackTraceString(e));
  246. }
  247. return false;
  248. }
  249. /**
  250. * 设置状态
  251. * @param state
  252. */
  253. public void setPresence(int state){
  254. Presence presence;
  255. switch(state){
  256. case 0:
  257. presence = new Presence(Presence.Type.available);
  258. con.sendPacket(presence);
  259. SLog.e(tag, "设置在线");
  260. break;
  261. case 1:
  262. presence = new Presence(Presence.Type.available);
  263. presence.setMode(Presence.Mode.chat);
  264. con.sendPacket(presence);
  265. SLog.e(tag, "Q我吧");
  266. SLog.e(tag, presence.toXML());
  267. break;
  268. case 2:
  269. presence = new Presence(Presence.Type.available);
  270. presence.setMode(Presence.Mode.dnd);
  271. con.sendPacket(presence);
  272. SLog.e(tag, "忙碌");
  273. SLog.e(tag, presence.toXML());
  274. break;
  275. case 3:
  276. presence = new Presence(Presence.Type.available);
  277. presence.setMode(Presence.Mode.away);
  278. con.sendPacket(presence);
  279. SLog.e(tag, "离开");
  280. SLog.e(tag, presence.toXML());
  281. break;
  282. case 4:
  283. Roster roster = con.getRoster();
  284. Collection<RosterEntry> entries = roster.getEntries();
  285. for(RosterEntry entity:entries){
  286. presence = new Presence(Presence.Type.unavailable);
  287. presence.setPacketID(Packet.ID_NOT_AVAILABLE);
  288. presence.setFrom(con.getUser());
  289. presence.setTo(entity.getUser());
  290. con.sendPacket(presence);
  291. SLog.e(tag, presence.toXML());
  292. }
  293. SLog.e(tag, "告知其他用户-隐身");
  294. presence = new Presence(Presence.Type.unavailable);
  295. presence.setPacketID(Packet.ID_NOT_AVAILABLE);
  296. presence.setFrom(con.getUser());
  297. presence.setTo(StringUtils.parseBareAddress(con.getUser()));
  298. con.sendPacket(presence);
  299. SLog.e(tag, "告知本用户的其他客户端-隐身");
  300. SLog.e(tag, presence.toXML());
  301. break;
  302. case 5:
  303. presence = new Presence(Presence.Type.unavailable);
  304. con.sendPacket(presence);
  305. SLog.e(tag, "离线");
  306. SLog.e(tag, presence.toXML());
  307. break;
  308. default:
  309. break;
  310. }
  311. }
  312. /**
  313. * 删除账号
  314. * @return
  315. */
  316. public boolean deleteCount(){
  317. try {
  318. con.getAccountManager().deleteAccount();
  319. return true;
  320. } catch (XMPPException e) {
  321. SLog.e(tag, Log.getStackTraceString(e));
  322. }
  323. return false;
  324. }
  325. public void configure(ProviderManager pm) {
  326. // Private Data Storage
  327. pm.addIQProvider("query", "jabber:iq:private",
  328. new PrivateDataManager.PrivateDataIQProvider());
  329. // Time
  330. try {
  331. pm.addIQProvider("query", "jabber:iq:time",
  332. Class.forName("org.jivesoftware.smackx.packet.Time"));
  333. } catch (ClassNotFoundException e) {
  334. Log.w("TestClient",
  335. "Can't load class for org.jivesoftware.smackx.packet.Time");
  336. }
  337. // Roster Exchange
  338. pm.addExtensionProvider("x", "jabber:x:roster",
  339. new RosterExchangeProvider());
  340. // Message Events
  341. pm.addExtensionProvider("x", "jabber:x:event",
  342. new MessageEventProvider());
  343. // Chat State
  344. pm.addExtensionProvider("active",
  345. "http://jabber.org/protocol/chatstates",
  346. new ChatStateExtension.Provider());
  347. pm.addExtensionProvider("composing",
  348. "http://jabber.org/protocol/chatstates",
  349. new ChatStateExtension.Provider());
  350. pm.addExtensionProvider("paused",
  351. "http://jabber.org/protocol/chatstates",
  352. new ChatStateExtension.Provider());
  353. pm.addExtensionProvider("inactive",
  354. "http://jabber.org/protocol/chatstates",
  355. new ChatStateExtension.Provider());
  356. pm.addExtensionProvider("gone",
  357. "http://jabber.org/protocol/chatstates",
  358. new ChatStateExtension.Provider());
  359. // XHTML
  360. pm.addExtensionProvider("html", "http://jabber.org/protocol/xhtml-im",
  361. new XHTMLExtensionProvider());
  362. // Group Chat Invitations
  363. pm.addExtensionProvider("x", "jabber:x:conference",
  364. new GroupChatInvitation.Provider());
  365. // Service Discovery # Items
  366. pm.addIQProvider("query", "http://jabber.org/protocol/disco#items",
  367. new DiscoverItemsProvider());
  368. // Service Discovery # Info
  369. pm.addIQProvider("query", "http://jabber.org/protocol/disco#info",
  370. new DiscoverInfoProvider());
  371. // Data Forms
  372. pm.addExtensionProvider("x", "jabber:x:data", new DataFormProvider());
  373. // MUC User
  374. pm.addExtensionProvider("x", "http://jabber.org/protocol/muc#user",
  375. new MUCUserProvider());
  376. // MUC Admin
  377. pm.addIQProvider("query", "http://jabber.org/protocol/muc#admin",
  378. new MUCAdminProvider());
  379. // MUC Owner
  380. pm.addIQProvider("query", "http://jabber.org/protocol/muc#owner",
  381. new MUCOwnerProvider());
  382. // Delayed Delivery
  383. pm.addExtensionProvider("x", "jabber:x:delay",
  384. new DelayInformationProvider());
  385. // Version
  386. try {
  387. pm.addIQProvider("query", "jabber:iq:version",
  388. Class.forName("org.jivesoftware.smackx.packet.Version"));
  389. } catch (ClassNotFoundException e) {
  390. // Not sure what's happening here.
  391. }
  392. // VCard
  393. pm.addIQProvider("vCard", "vcard-temp", new VCardProvider());
  394. // Offline Message Requests
  395. pm.addIQProvider("offline", "http://jabber.org/protocol/offline",
  396. new OfflineMessageRequest.Provider());
  397. // Offline Message Indicator
  398. pm.addExtensionProvider("offline",
  399. "http://jabber.org/protocol/offline",
  400. new OfflineMessageInfo.Provider());
  401. // Last Activity
  402. pm.addIQProvider("query", "jabber:iq:last", new LastActivity.Provider());
  403. // User Search
  404. pm.addIQProvider("query", "jabber:iq:search", new UserSearch.Provider());
  405. // SharedGroupsInfo
  406. pm.addIQProvider("sharedgroup",
  407. "http://www.jivesoftware.org/protocol/sharedgroup",
  408. new SharedGroupsInfo.Provider());
  409. // JEP-33: Extended Stanza Addressing
  410. pm.addExtensionProvider("addresses",
  411. "http://jabber.org/protocol/address",
  412. new MultipleAddressesProvider());
  413. // FileTransfer
  414. pm.addIQProvider("si", "http://jabber.org/protocol/si",
  415. new StreamInitiationProvider());
  416. pm.addIQProvider("query", "http://jabber.org/protocol/bytestreams",
  417. new BytestreamsProvider());
  418. pm.addIQProvider("open", "http://jabber.org/protocol/ibb",
  419. new OpenIQProvider());
  420. pm.addIQProvider("close", "http://jabber.org/protocol/ibb",
  421. new CloseIQProvider());
  422. pm.addExtensionProvider("data", "http://jabber.org/protocol/ibb",
  423. new DataPacketProvider());
  424. // Privacy
  425. pm.addIQProvider("query", "jabber:iq:privacy", new PrivacyProvider());
  426. pm.addIQProvider("command", "http://jabber.org/protocol/commands",
  427. new AdHocCommandDataProvider());
  428. pm.addExtensionProvider("malformed-action",
  429. "http://jabber.org/protocol/commands",
  430. new AdHocCommandDataProvider.MalformedActionError());
  431. pm.addExtensionProvider("bad-locale",
  432. "http://jabber.org/protocol/commands",
  433. new AdHocCommandDataProvider.BadLocaleError());
  434. pm.addExtensionProvider("bad-payload",
  435. "http://jabber.org/protocol/commands",
  436. new AdHocCommandDataProvider.BadPayloadError());
  437. pm.addExtensionProvider("bad-sessionid",
  438. "http://jabber.org/protocol/commands",
  439. new AdHocCommandDataProvider.BadSessionIDError());
  440. pm.addExtensionProvider("session-expired",
  441. "http://jabber.org/protocol/commands",
  442. new AdHocCommandDataProvider.SessionExpiredError());
  443. }
  444. /**
  445. * 获取所有分组
  446. * @param roster
  447. * @return
  448. */
  449. public List<RosterGroup> getGroups(Roster roster){
  450. List<RosterGroup> list = new ArrayList<RosterGroup>();
  451. list.addAll(roster.getGroups());
  452. return list;
  453. }
  454. /**
  455. * 添加分组
  456. * @param roster
  457. * @param groupName
  458. * @return
  459. */
  460. public boolean addGroup(Roster roster,String groupName){
  461. try{
  462. roster.createGroup(groupName);
  463. return true;
  464. }catch(Exception e){
  465. SLog.e(tag, Log.getStackTraceString(e));
  466. }
  467. return false;
  468. }
  469. /**
  470. * 添加到分组
  471. * @param roster
  472. * @param userName
  473. * @param groupName
  474. */
  475. // public void addUserToGroup(Roster roster,String userName,String groupName){
  476. // RosterGroup group = roster.getGroup(groupName);
  477. // if( null == group){
  478. // group = roster.createGroup(groupName);
  479. // }
  480. // RosterEntry entry = roster.getEntry(userName);
  481. // try {
  482. // group.addEntry(entry);
  483. // } catch (XMPPException e) {
  484. // SLog.e(tag, Log.getStackTraceString(e));
  485. // }
  486. // }
  487. /**
  488. * 获取所有成员
  489. * @param roster
  490. * @return
  491. */
  492. public List<RosterEntry> getAllEntrys(Roster roster){
  493. List<RosterEntry> list = new ArrayList<RosterEntry>();
  494. list.addAll(roster.getEntries());
  495. return list;
  496. }
  497. /**
  498. * 获取某一个分组的成员
  499. * @param roster
  500. * @param groupName
  501. * @return
  502. */
  503. public List<RosterEntry> getEntrysByGroup(Roster roster,String groupName){
  504. List<RosterEntry> list = new ArrayList<RosterEntry>();
  505. RosterGroup group = roster.getGroup(groupName);
  506. list.addAll(group.getEntries());
  507. return list;
  508. }
  509. /**
  510. * 获取用户VCard信息
  511. * @param user
  512. * @return
  513. */
  514. public VCard getVCard(String user){
  515. VCard vCard = new VCard();
  516. try {
  517. vCard.load(con, user);
  518. } catch (XMPPException e) {
  519. SLog.e(tag, Log.getStackTraceString(e));
  520. return null;
  521. }
  522. return vCard;
  523. }
  524. /**
  525. * 发送好友请求
  526. * @param userName
  527. */
  528. public void sendAddFriendRequest(String userName , Presence.Type type){
  529. Presence subscription = new Presence(type);
  530. subscription.setTo(userName);
  531. con.sendPacket(subscription);
  532. }
  533. /**
  534. * 添加好友
  535. * @param roster
  536. * @param userName
  537. * @param name
  538. * @param groupName 是否有分组
  539. * @return
  540. */
  541. public boolean addUser(Roster roster,String userName,String name,String groupName){
  542. try {
  543. roster.createEntry(userName, name, null==groupName?null:new String[]{groupName});
  544. return true;
  545. } catch (XMPPException e) {
  546. SLog.e(tag, Log.getStackTraceString(e));
  547. }
  548. return false;
  549. }
  550. /**
  551. * 删除好友
  552. * @param roster
  553. * @param userName
  554. * @return
  555. */
  556. public boolean removeUser(Roster roster,String userName){
  557. try {
  558. if(!userName.contains(con.getServiceName()))
  559. userName = userName+con.getServiceName();
  560. XmppTool.getInstance().sendAddFriendRequest(userName,Presence.Type.unsubscribe);
  561. RosterEntry entry = roster.getEntry(userName);
  562. if(null!=entry){
  563. roster.removeEntry(entry);
  564. return true;
  565. }
  566. } catch (XMPPException e) {
  567. SLog.e(tag, Log.getStackTraceString(e));
  568. }
  569. return false;
  570. }
  571. /**
  572. * 查找用户
  573. * @param serverDomain
  574. * @param userName
  575. * @return
  576. */
  577. public List<User> searchUsers(String serverDomain,String userName){
  578. List<User> list = new ArrayList<User>();
  579. UserSearchManager userSearchManager = new UserSearchManager(con);
  580. try {
  581. Form searchForm = userSearchManager.getSearchForm("search."+serverDomain);
  582. Form answerForm = searchForm.createAnswerForm();
  583. answerForm.setAnswer("Username", true);
  584. answerForm.setAnswer("Name", true);
  585. answerForm.setAnswer("search", userName);
  586. ReportedData data = userSearchManager.getSearchResults(answerForm, "search."+serverDomain);
  587. Iterator<Row> rows = data.getRows();
  588. while(rows.hasNext()){
  589. User user = new User();
  590. Row row = rows.next();
  591. user.setUserName(row.getValues("Username").next().toString());
  592. user.setName(row.getValues("Name").next().toString());
  593. SLog.i(tag, user.toString());
  594. list.add(user);
  595. }
  596. } catch (XMPPException e) {
  597. SLog.e(tag, Log.getStackTraceString(e));
  598. }
  599. return list;
  600. }
  601. /**
  602. * 发送文件
  603. * @param recvUser
  604. * @param filePath
  605. */
  606. public void sendFile(String recvUser,String filePath){
  607. FileTransferManager fileTransferManager = new FileTransferManager(con);
  608. try {
  609. final OutgoingFileTransfer outgoingFileTransfer = fileTransferManager.createOutgoingFileTransfer(recvUser);
  610. SLog.i(tag, "上送文件"+filePath);
  611. outgoingFileTransfer.sendFile(new File(filePath),"outgoingFileTransfer ^_^");
  612. SApp.getInstance().execRunnable(new Runnable(){
  613. @Override
  614. public void run() {
  615. while (!outgoingFileTransfer.isDone()) {
  616. SLog.i(tag,"进度:"+outgoingFileTransfer.getProgress());
  617. try {
  618. Thread.sleep(100);
  619. } catch (InterruptedException e) {
  620. SLog.e(tag, Log.getStackTraceString(e));
  621. }
  622. }
  623. SLog.i(tag,"上送状态"+outgoingFileTransfer.getStatus());
  624. if(outgoingFileTransfer.getStatus().equals(Status.complete))
  625. SLog.i(tag,"上送完毕");
  626. else if(outgoingFileTransfer.getStatus().equals(Status.error))
  627. SLog.i(tag,"上送出错");
  628. }});
  629. } catch (XMPPException e) {
  630. SLog.i(tag, "上送文件异常");
  631. SLog.e(tag, Log.getStackTraceString(e));
  632. }
  633. }
  634. /**
  635. * 注册文件接收器
  636. */
  637. public void registRecvFileListener(){
  638. FileTransferManager fileTransferManager = new FileTransferManager(con);
  639. fileTransferManager.addFileTransferListener(new FileTransferListener() {
  640. public void fileTransferRequest(final FileTransferRequest request) {
  641. final IncomingFileTransfer transfer = request.accept();
  642. try{
  643. SLog.i(tag,"接受文件:"+transfer.getFileName());
  644. transfer.recieveFile(new File(Environment.getExternalStorageDirectory()+"/"+request.getFileName()));
  645. SApp.getInstance().execRunnable(new Runnable(){
  646. @Override
  647. public void run() {
  648. while (!transfer.isDone()) {
  649. SLog.i(tag,"进度:"+transfer.getProgress());
  650. try {
  651. Thread.sleep(100);
  652. } catch (InterruptedException e) {
  653. SLog.e(tag, Log.getStackTraceString(e));
  654. }
  655. }
  656. SLog.i(tag,"接受状态"+transfer.getStatus());
  657. if(transfer.getStatus().equals(Status.complete))
  658. SLog.i(tag,"接受完毕");
  659. else if(transfer.getStatus().equals(Status.error)){
  660. transfer.cancel();
  661. SLog.i(tag,"接受出错");
  662. }
  663. }});
  664. }catch(Exception e){
  665. SLog.e(tag, Log.getStackTraceString(e));
  666. SLog.e(tag, "文件接收出错");
  667. transfer.cancel();
  668. }
  669. }
  670. });
  671. }
  672. /**
  673. * 获取离线消息
  674. * @return
  675. */
  676. public List<Message> getOffLineMessages(){
  677. List<Message> msgs = new ArrayList<Message>();
  678. OfflineMessageManager offLineMessageManager = new OfflineMessageManager(con);
  679. try {
  680. Iterator<Message> it = offLineMessageManager.getMessages();
  681. while(it.hasNext()){
  682. Message msg = it.next();
  683. SLog.i(tag, msg.toXML());
  684. msgs.add(msg);
  685. }
  686. offLineMessageManager.deleteMessages();
  687. } catch (XMPPException e) {
  688. e.printStackTrace();
  689. }
  690. return msgs;
  691. }
  692. /**
  693. * 创建会议室
  694. * @param roomName
  695. * @param roomPwd 会议室密码
  696. */
  697. public boolean createRoom(String roomName , String roomPwd , String subject){
  698. MultiUserChat multiUserChat = new MultiUserChat(con,roomName+CONFERENCE+con.getServiceName());
  699. try {
  700. multiUserChat.create(roomName);
  701. Form configForm = multiUserChat.getConfigurationForm();
  702. Form submitForm = configForm.createAnswerForm();
  703. for(Iterator<FormField> fields = configForm.getFields();fields.hasNext();){
  704. FormField formField = fields.next();
  705. if(!formField.getType().equals(FormField.TYPE_HIDDEN) && formField.getVariable()!=null){
  706. submitForm.setDefaultAnswer(formField.getVariable());
  707. }
  708. }
  709. List<String> owners = new ArrayList<String>();
  710. owners.add(con.getUser());
  711. submitForm.setAnswer("muc#roomconfig_roomowners", owners);
  712. submitForm.setAnswer("muc#roomconfig_roomname", roomName);//房间名字
  713. submitForm.setAnswer("muc#roomconfig_persistentroom", true);//永久存在,不会再用户都推出时destroy
  714. submitForm.setAnswer("muc#roomconfig_membersonly", true);//只许成员进入
  715. submitForm.setAnswer("muc#roomconfig_allowinvites", true);//允许邀请
  716. submitForm.setAnswer("muc#roomconfig_passwordprotectedroom", true);//凭密码进入
  717. submitForm.setAnswer("muc#roomconfig_roomsecret", roomPwd);//密码
  718. // submitForm.setAnswer("muc#roomconfig_enablelogging", true);
  719. multiUserChat.sendConfigurationForm(submitForm);
  720. } catch (XMPPException e) {
  721. SLog.e(tag, "创建聊天室 出错");
  722. SLog.e(tag, Log.getStackTraceString(e));
  723. return false;
  724. }
  725. return true;
  726. }
  727. /**
  728. * 加入聊天室
  729. * @param user
  730. * @param pwd 会议室密码
  731. * @param roomName
  732. * @return
  733. */
  734. public MultiUserChat joinRoom(String user,String pwd,String roomName){
  735. MultiUserChat muc = new MultiUserChat(con,roomName.contains(CONFERENCE)?roomName:roomName+CONFERENCE+con.getServiceName());
  736. DiscussionHistory history = new DiscussionHistory();
  737. history.setMaxStanzas(100);
  738. history.setSince(new Date(2014,01,01));
  739. // history.setSeconds(1000);
  740. // history.setSince(new Date());
  741. try {
  742. muc.join(user, pwd, history, SmackConfiguration.getPacketReplyTimeout());
  743. Message msg = muc.nextMessage(1000);
  744. if(null!=msg)
  745. SLog.i(tag, msg.toXML());
  746. //
  747. // Message msg2 = muc.nextMessage();
  748. // if(null!=msg2)
  749. // SLog.i(tag, msg2.toXML());
  750. //
  751. // Message msg3 = muc.nextMessage();
  752. // if(null!=msg3)
  753. // SLog.i(tag, msg3.toXML());
  754. //
  755. // Message msg4 = muc.nextMessage();
  756. // if(null!=msg4)
  757. // SLog.i(tag, msg4.toXML());
  758. // Message msg = null;
  759. // while(null!=(msg = muc.nextMessage())){
  760. // SLog.i(tag, msg.toXML());
  761. // }
  762. } catch (XMPPException e) {
  763. SLog.e(tag, " 加入 聊天室 出错");
  764. SLog.e(tag, Log.getStackTraceString(e));
  765. return null;
  766. }
  767. return muc;
  768. }
  769. /**
  770. * 获取会议室成员名字
  771. * @param muc
  772. * @return
  773. */
  774. public List<String> getMUCMembers(MultiUserChat muc){
  775. List<String> members = new ArrayList<String>();
  776. Iterator<String> it = muc.getOccupants();
  777. while(it.hasNext()){
  778. String name = StringUtils.parseResource(it.next());
  779. SLog.i("成员名字", name);
  780. members.add(name);
  781. }
  782. return members;
  783. }
  784. /**
  785. * 获取Hostedrooms
  786. * @return
  787. */
  788. public List<MucRoom> getAllHostedRooms(){
  789. List<MucRoom> rooms = new ArrayList<MucRoom>();
  790. try {
  791. Collection<HostedRoom> hrooms = MultiUserChat.getHostedRooms(con, con.getServiceName());
  792. if(!hrooms.isEmpty()){
  793. for(HostedRoom r:hrooms){
  794. RoomInfo roominfo = MultiUserChat.getRoomInfo(con, r.getJid());
  795. SLog.i("会议室Info", roominfo.toString());
  796. MucRoom mr = new MucRoom();
  797. mr.setDescription(roominfo.getDescription());
  798. mr.setName(r.getName());
  799. mr.setJid(r.getJid());
  800. mr.setOccupants(roominfo.getOccupantsCount());
  801. mr.setSubject(roominfo.getSubject());
  802. rooms.add(mr);
  803. }
  804. }
  805. } catch (XMPPException e) {
  806. SLog.e(tag, " 获取Hosted Rooms 出错");
  807. SLog.e(tag, Log.getStackTraceString(e));
  808. }
  809. return rooms;
  810. }
  811. /**
  812. * 获取已经加入的room列表
  813. * @return
  814. */
  815. public List<BookmarkedConference> getJoinedRooms(){
  816. List<BookmarkedConference> rooms = new ArrayList<BookmarkedConference>();
  817. try {
  818. BookmarkManager bm = BookmarkManager.getBookmarkManager(con);
  819. Collection<BookmarkedConference> cl = bm.getBookmarkedConferences();
  820. Iterator<BookmarkedConference> it = cl.iterator();
  821. while(it.hasNext()){
  822. BookmarkedConference bc = it.next();
  823. rooms.add(bc);
  824. SLog.i(tag, bc.toString());
  825. }
  826. } catch (XMPPException e) {
  827. SLog.e(tag, Log.getStackTraceString(e));
  828. }
  829. return rooms;
  830. }
  831. /**
  832. * 创建给予聊天室的私聊
  833. * @param participant myroom@conference.jabber.org/johndoe
  834. * @param listener
  835. * @return
  836. */
  837. public Chat createPrivateChat(String participant , MessageListener listener){
  838. return muc.createPrivateChat(participant, listener);
  839. }
  840. /**
  841. * 用户是否支持聊天室
  842. * @param user
  843. * @return
  844. */
  845. // public boolean isUserSupportMUC(String user){
  846. // return MultiUserChat.isServiceEnabled(con, user);
  847. // }
  848. /**
  849. * 离开聊天室
  850. */
  851. public void leaveRoom(){
  852. if(null!=muc)
  853. muc.leave();
  854. muc = null;
  855. }
  856. public String str2md5(String inStr) {
  857. MessageDigest md5 = null;
  858. try {
  859. md5 = MessageDigest.getInstance("MD5");
  860. } catch (Exception e) {
  861. SLog.e(tag, Log.getStackTraceString(e));
  862. return "";
  863. }
  864. char[] charArray = inStr.toCharArray();
  865. byte[] byteArray = new byte[charArray.length];
  866. for (int i = 0; i < charArray.length; i++)
  867. byteArray[i] = (byte) charArray[i];
  868. byte[] md5Bytes = md5.digest(byteArray);
  869. StringBuffer hexValue = new StringBuffer();
  870. for (int i = 0; i < md5Bytes.length; i++) {
  871. int val = ((int) md5Bytes[i]) & 0xff;
  872. if (val < 16)
  873. hexValue.append("0");
  874. hexValue.append(Integer.toHexString(val));
  875. }
  876. return hexValue.toString();
  877. }
  878. }