asmack小结

来源:互联网 发布:邓肯生涯数据 编辑:程序博客网 时间:2024/05/17 11:35

转载自:http://blog.csdn.net/yueqinglkong/article/details/37810865

由于asmack在近段时间不更新了,存在的好多bug都的慢慢的自己去解决,老版本的问题也比较复杂,很伤脑筋!


我所遇到的问题主要在于以下几个方面:

1.api:

asmack和smack是不同的,尤其是asmack不更新后,smack的类和方法变化了一些,文档这方面就很纠结。

2.asmack本身的问题:

由于不更新了,所以许多问题存在就一直存在了,网友改的jar,也不咋统一,看你运气了,遇到好的包就好用。

3.参考资料:

也许你可以看看smack的api。这样的话,许多的东西你也许会明白许多。

4.工程结构:

开始的时候,自己也不咋熟悉,结构混乱,苦头吃了不少。现在稍微要好点了,建议你在使用之前好好的考虑下结构问题,不然你会很麻烦的。


下面是我的工程大概流程图:


在这demo中,主要实现的功能:

登录,注册,搜索和添加好友,查看好友的个人信息,与好友的聊天和发送文件。

当然,demo中主要是方法和流程,对于优化神马的,没再写了。


下面贴出工厂中的方法,主要的方法都在这里面:

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. public class ConnecMethod {  
  2.     /**  
  3.      * 登录  
  4.      *   
  5.      * @param account  
  6.      *            登录帐号  
  7.      * @param password  
  8.      *            登录密码  
  9.      * @return  
  10.      */  
  11.     public static boolean login(String account, String password) {  
  12.         try {  
  13.             if (XmppTool.getConnection() == null)  
  14.                 return false;  
  15.             /** 登录 */  
  16.             SASLAuthentication.supportSASLMechanism("PLAIN", 0);  
  17.             XmppTool.getConnection().login(account, password);  
  18.             // 设置登录状态:在线  
  19.             // Presence presence = new Presence(Presence.Type.available);  
  20.             // XmppTool.getConnection().sendPacket(presence);  
  21.             return true;  
  22.         } catch (Exception e) {  
  23.             e.printStackTrace();  
  24.         }  
  25.         return false;  
  26.     }  
  27.   
  28.     /**  
  29.      * 注册  
  30.      *   
  31.      * @param account  
  32.      *            注册帐号  
  33.      * @param password  
  34.      *            注册密码  
  35.      */  
  36.     public static String regist(String account, String password) {  
  37.         if (XmppTool.getConnection() == null)  
  38.             return "0";  
  39.         Registration reg = new Registration();  
  40.         reg.setType(IQ.Type.SET);  
  41.         reg.setTo(XmppTool.getConnection().getServiceName());  
  42.         reg.setUsername(account);// 注意这里createAccount注册时,参数是username,不是jid,是“@”前面的部分。  
  43.         reg.setPassword(password);  
  44.         reg.addAttribute("android", "geolo_createUser_android");// 这边addAttribute不能为空,否则出错。所以做个标志是android手机创建的吧!!!!!  
  45.         PacketFilter filter = new AndFilter(new PacketIDFilter(  
  46.                 reg.getPacketID()), new PacketTypeFilter(IQ.class));  
  47.         PacketCollector collector = XmppTool.getConnection()  
  48.                 .createPacketCollector(filter);  
  49.         XmppTool.getConnection().sendPacket(reg);  
  50.         IQ result = (IQ) collector.nextResult(SmackConfiguration  
  51.                 .getPacketReplyTimeout());  
  52.         // Stop queuing results  
  53.         collector.cancel();// 停止请求results(是否成功的结果)  
  54.         if (result == null) {  
  55.             Log.e("RegistActivity", "No response from server.");  
  56.             return "服务器没有结果";  
  57.         } else if (result.getType() == IQ.Type.RESULT) {  
  58.             return "注册成功";  
  59.         } else { // if (result.getType() == IQ.Type.ERROR)  
  60.             if (result.getError().toString().equalsIgnoreCase("conflict(409)")) {  
  61.                 Log.e("RegistActivity", "IQ.Type.ERROR: "  
  62.                         + result.getError().toString());  
  63.                 return "账号已经存在";  
  64.             } else {  
  65.                 Log.e("RegistActivity", "IQ.Type.ERROR: "  
  66.                         + result.getError().toString());  
  67.                 return "注册失败";  
  68.             }  
  69.         }  
  70.     }  
  71.   
  72.     /**  
  73.      * 获取所有好友  
  74.      *   
  75.      * @return  
  76.      */  
  77.     public static List<RosterEntry> searchAllFriends() {  
  78.         List<RosterEntry> entries = new ArrayList<RosterEntry>();  
  79.         Collection<RosterEntry> roscol = XmppTool.getConnection().getRoster()  
  80.                 .getEntries();  
  81.         Iterator<RosterEntry> iter = roscol.iterator();  
  82.   
  83.         while (iter.hasNext()) {  
  84.             entries.add(iter.next());  
  85.         }  
  86.         return entries;  
  87.     }  
  88.   
  89.     /**  
  90.      * 获取所有组  
  91.      *   
  92.      * @return  
  93.      */  
  94.     public static List<RosterGroup> searchAllGroup() {  
  95.         List<RosterGroup> groups = new ArrayList<RosterGroup>();  
  96.         Collection<RosterGroup> roscol = XmppTool.getConnection().getRoster()  
  97.                 .getGroups();  
  98.         Iterator<RosterGroup> iter = roscol.iterator();  
  99.         while (iter.hasNext()) {  
  100.             groups.add(iter.next());  
  101.         }  
  102.         return groups;  
  103.     }  
  104.   
  105.     /**  
  106.      * 获取某组的所有好友  
  107.      *   
  108.      * @param group  
  109.      * @return  
  110.      */  
  111.     public static List<RosterEntry> getGroupFriends(String group) {  
  112.         List<RosterEntry> entries = new ArrayList<RosterEntry>();  
  113.         RosterGroup rosgrou = XmppTool.getConnection().getRoster()  
  114.                 .getGroup(group);  
  115.         Collection<RosterEntry> roscol = rosgrou.getEntries();  
  116.         Iterator<RosterEntry> iter = roscol.iterator();  
  117.         while (iter.hasNext()) {  
  118.             entries.add(iter.next());  
  119.         }  
  120.         return entries;  
  121.     }  
  122.   
  123.     /**  
  124.      * 创建新组  
  125.      *   
  126.      * @param group  
  127.      * @return a new group, or null if the group already exists  
  128.      */  
  129.     public static boolean addNewGroup(String group) {  
  130.         try {  
  131.             XmppTool.getConnection().getRoster().createGroup(group);  
  132.             return true;  
  133.         } catch (Exception e) {  
  134.             e.printStackTrace();  
  135.             return false;  
  136.         }  
  137.     }  
  138.   
  139.     /**  
  140.      * 添加组好友  
  141.      *   
  142.      * @param group  
  143.      * @param friend  
  144.      */  
  145.     public static void addGroupFriend(String group, String friend) {  
  146.         Roster roster = XmppTool.getConnection().getRoster();  
  147.         try {  
  148.             roster.createEntry(friend + "@coboqo", null, new String[] { group });  
  149.         } catch (XMPPException e) {  
  150.             // TODO Auto-generated catch block  
  151.             e.printStackTrace();  
  152.         }  
  153.     }  
  154.   
  155.     /**  
  156.      * 搜索用户  
  157.      */  
  158.     public static ArrayList<String> searchUsers(String user) {  
  159.         ArrayList<String> users = new ArrayList<String>();  
  160.         UserSearchManager usm = new UserSearchManager(XmppTool.getConnection());  
  161.         Form searchForm = null;  
  162.         try {  
  163.             searchForm = usm.getSearchForm("search."  
  164.                     + XmppTool.getConnection().getServiceName());  
  165.             Form answerForm = searchForm.createAnswerForm();  
  166.             answerForm.setAnswer("Username", true);  
  167.             answerForm.setAnswer("search", user);  
  168.             ReportedData data = usm.getSearchResults(answerForm, "search."  
  169.                     + XmppTool.getConnection().getServiceName());  
  170.             // column:jid,Username,Name,Email  
  171.             Iterator<Row> it = data.getRows();  
  172.             Row row = null;  
  173.             while (it.hasNext()) {  
  174.                 row = it.next();  
  175.                 // Log.d("UserName",  
  176.                 // row.getValues("Username").next().toString());  
  177.                 // Log.d("Name", row.getValues("Name").next().toString());  
  178.                 // Log.d("Email", row.getValues("Email").next().toString());  
  179.                 // 若存在,则有返回,UserName一定非空,其他两个若是有设,一定非空  
  180.                 users.add(row.getValues("Username").next().toString());  
  181.             }  
  182.         } catch (XMPPException e) {  
  183.             // TODO Auto-generated catch block  
  184.             e.printStackTrace();  
  185.         }  
  186.         return users;  
  187.     }  
  188.   
  189.     /**  
  190.      * 获取离线的消息  
  191.      *   
  192.      * @return  
  193.      */  
  194.     public static List<org.jivesoftware.smack.packet.Message> getOffLine() {  
  195.         List<org.jivesoftware.smack.packet.Message> msglist = new ArrayList<org.jivesoftware.smack.packet.Message>();  
  196.         // 获取离线消息,线程阻塞 不能Toast  
  197.         try {  
  198.             Iterator<org.jivesoftware.smack.packet.Message> it = XmppTool  
  199.                     .getOffLineMessageManager().getMessages();  
  200.             while (it.hasNext()) {  
  201.                 org.jivesoftware.smack.packet.Message message = it.next();  
  202.                 msglist.add(message);  
  203.             }  
  204.         } catch (Exception e) {  
  205.             e.printStackTrace();  
  206.         } finally {  
  207.             try {  
  208.                 // 设置在线  
  209.                 Presence presence = new Presence(Presence.Type.available);  
  210.                 XmppTool.getConnection().sendPacket(presence);  
  211.                 XmppTool.getOffLineMessageManager().deleteMessages();  
  212.             } catch (XMPPException e) {  
  213.                 // TODO Auto-generated catch block  
  214.                 e.printStackTrace();  
  215.             }  
  216.         }  
  217.         return msglist;  
  218.     }  
  219.   
  220.     /**  
  221.      * 获取在线消息  
  222.      *   
  223.      * @return  
  224.      */  
  225.     public static void getOnLine(final Context context) {  
  226.         ChatManager cm = XmppTool.getConnection().getChatManager();  
  227.         cm.addChatListener(new ChatManagerListener() {  
  228.             @Override  
  229.             public void chatCreated(Chat chat, boolean able) {  
  230.                 chat.addMessageListener(new MessageListener() {  
  231.                     @Override  
  232.                     public void processMessage(Chat chat2, Message message) {  
  233.                         Log.d("connectMethod:getOnLine()", message.getBody()  
  234.                                 + message.getFrom());  
  235.                         sendBroadcastMsg(context, message.getBody());  
  236.                     }  
  237.                 });  
  238.             }  
  239.         });  
  240.     }  
  241.   
  242.     /**  
  243.      * VCard  
  244.      */  
  245.     public static VCard getVCard(String user) {  
  246.         ProviderManager.getInstance().addIQProvider("vCard", "vcard-temp",  
  247.                 new org.jivesoftware.smackx.provider.VCardProvider());  
  248.         VCard card = new VCard();  
  249.         try {  
  250.             card.load(XmppTool.getConnection(), user);  
  251.             Log.d("*****", card.getFirstName() + card.getNickName());  
  252.         } catch (XMPPException e) {  
  253.             // TODO Auto-generated catch block  
  254.             e.printStackTrace();  
  255.         }  
  256.         return card;  
  257.     }  
  258.   
  259.     /**  
  260.      * 添加好友  
  261.      *   
  262.      * @param user  
  263.      */  
  264.     public static void addFriend(String user) {  
  265.         try {  
  266.             // 添加好友  
  267.             Roster roster = XmppTool.getConnection().getRoster();  
  268.             roster.createEntry(user + "@coboqo", null,  
  269.                     new String[] { "friends" });  
  270.         } catch (Exception e) {  
  271.             // TODO Auto-generated catch block  
  272.             e.printStackTrace();  
  273.         }  
  274.     }  
  275.   
  276.     /**  
  277.      * 文本广播  
  278.      *   
  279.      * @param context  
  280.      */  
  281.     private static void sendBroadcastMsg(Context context, String txt) {  
  282.         Intent intent = new Intent();  
  283.         intent.setAction("msg_receiver");  
  284.         intent.putExtra("msg", txt);  
  285.         context.sendBroadcast(intent);  
  286.     }  
  287.   
  288.     /**  
  289.      * 获取在线文件  
  290.      *   
  291.      * @param context  
  292.      */  
  293.     public static void getOnLineFile(Context context) {  
  294.         FileTransferManager fileTransferManagernew = new FileTransferManager(  
  295.                 XmppTool.getConnection());  
  296.         FileTransferListener filter = new ChatFileTransferListener(context);  
  297.         fileTransferManagernew.addFileTransferListener(filter);  
  298.     }  
  299.   
  300.     /**  
  301.      * 文件广播  
  302.      *   
  303.      * @param context  
  304.      */  
  305.     private static void sendBroadcastFile(Context context, String filepath) {  
  306.         Intent intent = new Intent();  
  307.         intent.setAction("file_receiver");  
  308.         intent.putExtra("path", filepath);  
  309.         context.sendBroadcast(intent);  
  310.     }  
  311.   
  312.     /**  
  313.      * 文件接受监听器  
  314.      *   
  315.      */  
  316.     static class ChatFileTransferListener implements FileTransferListener {  
  317.         Context context;  
  318.   
  319.         public ChatFileTransferListener(Context context) {  
  320.             // TODO Auto-generated constructor stub  
  321.             this.context = context;  
  322.         }  
  323.   
  324.         @Override  
  325.         public void fileTransferRequest(FileTransferRequest request) {  
  326.             // TODO Auto-generated method stub  
  327.             try {  
  328.                 File insFile = new File(  
  329.                         Environment.getExternalStorageDirectory() + "/"  
  330.                                 + request.getFileName());  
  331.                 IncomingFileTransfer infiletransfer = request.accept();  
  332.                 infiletransfer.recieveFile(insFile);  
  333.   
  334.                 sendBroadcastFile(context, insFile.getAbsolutePath());  
  335.             } catch (XMPPException e) {  
  336.                 // TODO Auto-generated catch block  
  337.                 e.printStackTrace();  
  338.             }  
  339.         }  
  340.     }  
  341.   
  342.     /**  
  343.      * 发送消息  
  344.      *   
  345.      * @param to  
  346.      * @param msg  
  347.      */  
  348.     public static void sendTalkMsg(String to, String msg) {  
  349.         Chat chat = XmppTool.getConnection().getChatManager()  
  350.                 .createChat(to, null);  
  351.         try {  
  352.             chat.sendMessage(msg);  
  353.         } catch (XMPPException e) {  
  354.             // TODO Auto-generated catch block  
  355.             e.printStackTrace();  
  356.         }  
  357.     }  
  358.   
  359.     /**  
  360.      * 发送文件  
  361.      *   
  362.      * @param to  
  363.      * @param filepath  
  364.      */  
  365.     public static void sendTalkFile(String to, String filepath) {  
  366.         FileTransferManager fileTransferManager = new FileTransferManager(  
  367.                 XmppTool.getConnection());  
  368.         OutgoingFileTransfer outgoingFileTransfer = fileTransferManager  
  369.                 .createOutgoingFileTransfer(to + "/Spark 2.6.3");  
  370.         File insfile = new File(filepath);  
  371.         try {  
  372.             outgoingFileTransfer.sendFile(insfile, "descr");  
  373.         } catch (XMPPException e) {  
  374.             // TODO Auto-generated catch block  
  375.             e.printStackTrace();  
  376.         }  
  377.     }  
  378.   
  379. }  

注释中,我还是写得很直白的,不多说了。


说明:

       1.在手机和Spark通讯和手机之间通讯的时候,jid后面添加是不同的,别混淆了之间的区别。

       2.为好友换组的时候,使用创建新组的方法就可以了,会把你的好友转到那组去。

       3.针对发送音频,图片等不同类型文件的时候,我们可以通过发送文件时添加的描述来区别,当然smack4.0已经有了现成的类和方法,至少现在的asmack版本我没看见提供的。



demo下载地址

帮助文档




0 0
原创粉丝点击