Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android基於XMPP Smack Openfire下學習開發IM(四)單人聊天和多人聊天(發送消息、接收消息)

Android基於XMPP Smack Openfire下學習開發IM(四)單人聊天和多人聊天(發送消息、接收消息)

編輯:關於Android編程

很久沒有寫博客了,回顧了一下原先學習的,接著沒有寫完的繼續寫咯。(ps:告訴大家一個秘密,其實寫寫博客對自己的幫助是非常大的哦~) 好了廢話不多說,進入主題吧。   一、單人聊天 1)發送消息: 首先要獲取一個聊天窗口,getConnection()為獲取連接connection的方法,調用getFriendChat()獲取 [java]   private Map<String, Chat> chatManage = new HashMap<String, Chat>();// 聊天窗口管理map集合      /**   * 獲取或創建聊天窗口   * @param friend 好友名   * @param listenter 聊天監聽器   * @return   */   public Chat getFriendChat(String friend, MessageListener listenter) {       if(getConnection()==null)           return null;       /** 判斷是否創建聊天窗口 */       for (String fristr : chatManage.keySet()) {           if (fristr.equals(friend)) {               // 存在聊天窗口,則返回對應聊天窗口               return chatManage.get(fristr);           }       }       /** 創建聊天窗口 */       Chat chat = getConnection().getChatManager().createChat(friend + "@"+               getConnection().getServiceName(), listenter);       /** 添加聊天窗口到chatManage */       chatManage.put(friend, chat);       return chat;   }     friend為好友名,不是JID;listener 監聽器可以傳null,利用聊天窗口對象調用sendMessage發送消息 這裡sendMessage我傳的是一個JSON字符串,以便更靈活的控制,發送消息完成,很簡單吧~ [java]   Chat chat = getFriendChat(friend,null);   try {       String msgjson = "{\"messageType\":\""+messageType+"\",\"chanId\":\""+chanId+"\",\"chanName\":\""+chanName+"\"}";       chat.sendMessage(msgjson);   } catch (XMPPException e) {       e.printStackTrace();   }     2)接受消息: 創建一個消息監聽器,這裡我單獨寫了一個類 [java]   package com.techrare.listener;      import org.jivesoftware.smack.Chat;   import org.jivesoftware.smack.ChatManagerListener;   import org.jivesoftware.smack.MessageListener;   import org.jivesoftware.smack.packet.Message;   import org.jivesoftware.smack.util.StringUtils;   import org.json.JSONException;   import org.json.JSONObject;      import com.techrare.utils.XmppConnection;      /**   * 單人聊天信息監聽類   *    * @author Administrator   *    */   public class TaxiChatManagerListener implements ChatManagerListener {          public void chatCreated(Chat chat, boolean arg1) {           chat.addMessageListener(new MessageListener() {               public void processMessage(Chat arg0, Message msg) {                   //登錄用戶                   StringUtils.parseName(XmppConnection.getInstance().getConnection().getUser());                   //發送消息用戶                   msg.getFrom();                   //消息內容                   String body = msg.getBody();                   boolean left = body.substring(0, 1).equals("{");                   boolean right = body.substring(body.length()-1, body.length()).equals("}");                   if(left&&right){                       try {                           JSONObject obj = new JSONObject(body);                           String type = obj.getString("messageType");                           String chanId = obj.getString("chanId");                           String chanName = obj.getString("chanName");                       } catch (JSONException e) {                           e.printStackTrace();                       }                                          }               }           });       }   }     添加監聽,最好是放在登錄方法中,在關閉連接方法中,移除監聽,原因是為了避免重復添加監聽,接受重復消息 退出程序應該關閉連接,移除監聽,該監聽可以接受所有好友的消息,很方便吧~ [java]  TaxiChatManagerListener chatManagerListener = new TaxiChatManagerListener();   getConnection().getChatManager().addChatListener(chatManagerListener);   [java]   connection.getChatManager().removeChatListener(chatManagerListener);       二、多人聊天(會議室) 1)、發送消息 首先要獲取會議室對象(MultiUserChat),有兩種方法獲取 兩個方法前面都有講到,這裡再回顧一下 1、創建會議室   [java]   /**   * 創建房間   *    * @param roomName  房間名稱   */   public MultiUserChat createRoom(String user, String roomName,String password) {       if (getConnection() == null)           return null;          MultiUserChat muc = null;       try {           // 創建一個MultiUserChat           muc = 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());// 用戶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",                       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;   }     2、加入會議室, [java]   /**   * 加入會議室   *    * @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;       }   }     調用這個兩個方法都可以獲取到MultiUserChat,根據需求選擇一個就可以。 利用MultiUserChat對象調用sendMessage()方法即可,很容易吧~ [java]   try {       multiUserChat.sendMessage(message);   } catch (XMPPException e) {       e.printStackTrace();   }     2)接受消息     創建會議室消息監聽器,這裡我也單獨寫了一個類 [java]  package com.techrare.listener;      import org.jivesoftware.smack.PacketListener;   import org.jivesoftware.smack.packet.Message;   import org.jivesoftware.smack.packet.Packet;      /**   * 會議室消息監聽類   *    * @author Administrator   *    */   public class TaxiMultiListener implements PacketListener {          @Override       public void processPacket(Packet packet) {           Message message = (Message) packet;           String body = message.getBody();                  }   }     添加監聽器,每個會議室聊天對象都要添加一個消息監聽器,為了避免重復監聽 應該把會議室聊天對象放在一個集合當中,需要用到的時候取出來用即可。 [java]   multiUserChat.addMessageListener(new TaxiMultiListen
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved